"ALTER TABLE" для добавления столбца базы данных с Pony ORM
Я пытаюсь обновить базу данных SQL с помощью Pony ORM, но я не нашел, как изменить таблицу SQL, чтобы добавить столбец.
Что я хочу сделать, это:
ALTER TABLE USER ADD COLUMN sex char(1);
Может ли кто-нибудь помочь мне?
2 ответа
Вы можете использовать инструмент миграции из ветки orm-migrations. Официально еще не выпущено.
Кроме того, если база данных еще не содержит полезных данных, вы можете удалить все таблицы и заново создать их с нуля:
db.drop_all_tables(with_all_data=True)
db.create_tables()
Я использовал способ решения этой проблемы, который требует прямого использования 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.py
добавить
age
столбец в вашу базу данных:
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