“ ALTER TABLE”以使用Pony ORM添加数据库列

时间:2018-07-30 15:49:15

标签: ponyorm

我尝试使用Pony ORM更新SQL数据库,但是我没有找到如何更改SQL表以添加列的方法。

我想做的是:

ALTER TABLE USER ADD COLUMN sex char(1);

有人可以帮我吗?

2 个答案:

答案 0 :(得分:1)

您可以从orm-migrations分支使用迁移工具。它尚未正式发布。

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

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

答案 1 :(得分:0)

我已经对这个问题使用了一种变通方法,它需要直接使用 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