【问题标题】:"ALTER TABLE" to add a database column with Pony ORM"ALTER TABLE" 使用 Pony ORM 添加数据库列
【发布时间】:2019-01-06 22:18:06
【问题描述】:

我尝试使用 Pony ORM 更新 SQL 数据库,但没有找到如何通过 ALTER SQL 表添加列。

我想做的是:

ALTER TABLE USER ADD COLUMN sex char(1);

有人可以帮我吗?

【问题讨论】:

    标签: python mysql orm ponyorm


    【解决方案1】:

    您可以使用来自orm-migrations 分支的迁移工具。它还没有正式发布。

    或者,如果数据库还没有包含有用的数据,您可以删除所有表并从头开始重新创建它们:

    db.drop_all_tables(with_all_data=True)
    db.create_tables()
    

    【讨论】:

    • 感谢您的回答。你知道 orm-migrations 什么时候发布吗?
    【解决方案2】:

    如果您同意的话,我已经使用了一个需要直接使用 SQL 的解决方法来解决这个问题。基本上,您可以使用ALTER TABLE 命令添加列,然后修改您的 Pony 实体类,然后它应该可以正常加载。

    我不知道这种方法是否适用于这个非常基本的示例,或者这是否会进一步破坏某些东西。或许知道的人可以评论一下。

    无论如何,这是一个 MWE 的过程。

    ponymwe.py
    -----------
    from pony import orm
    
    db = orm.Database()
    
    class Person(db.Entity):
        name = orm.Required(str)
        #age = orm.Required(int) # <-- this is the column we want to add
    
    db.bind(provider='sqlite', filename='./tmp.sqlite', create_db=True)
    db.generate_mapping(create_tables=True)
    
    @orm.db_session
    def init_populate():
        Person(name='nic cage')
    
    @orm.db_session
    def showall():
        orm.show(Person)        # see the schema
        Person.select().show()  # see the entries
    

    运行init_populate() 将条目放入数据库。 然后运行以下update_schema.pyage 列添加到您的数据库中:

    update_schema.py
    ----------------
    import sqlite3
    
    con = sqlite3.connect('./tmp.sqlite')
    con.execute('ALTER TABLE person ADD COLUMN age INTEGER')
    con.execute('UPDATE person SET age=? WHERE name=?', (57, 'nic cage'))
    con.commit()
    

    现在返回ponymwe.py 并取消注释age = orm.Required(int),然后运行showall() 以查看架构和条目确实已更新:

    # output should be:
    class Person(Entity):
        id = PrimaryKey(int, auto=True)
        name = Required(str)
        age = Required(int)
    id|name    |age
    --+--------+---
    1 |nic cage|57 
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2018-12-01
      • 1970-01-01
      • 2014-08-31
      • 2022-01-25
      • 2012-04-28
      • 2013-03-19
      • 1970-01-01
      相关资源
      最近更新 更多