"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 
Другие вопросы по тегам