SQLAlchemy表未在数据库中反映

时间:2013-05-02 07:44:25

标签: sql sqlalchemy

我对在数据库中更改表以匹配SQLAlchemy的声明模型中定义的类对象感到困惑。

例如,我有一个包含这些字段的表commands

Command.__table__
Table('commands', MetaData(bind=None), Column('id', Integer(), table=<commands>, primary_key=True, nullable=False), Column('user_id', Integer(), ForeignKey('users.id'), table=<commands>), Column('command_title', String(length=50), table=<commands>), Column('command_desc', String(length=100), table=<commands>), Column('time_added', DateTime(), table=<commands>), Column('time_updated', DateTime(), table=<commands>), Column('favorite', Boolean(), table=<commands>), schema=None)

但是,当我尝试在数据库中添加新行时,SQL会抱怨。我想这是因为我刚刚添加了列favorite,它还没有反映在数据库中。

错误:

OperationalError: (OperationalError) table commands has no column named favorite u'INSERT INTO commands (user_id, command_title, command_desc, time_added, time_updated, favorite) VALUES (?, ?, ?, ?, ?, ?)' (2, u'HI', None, None, None, 1)

1 个答案:

答案 0 :(得分:0)

听起来您的数据库可能与您的model.py不同步。

快速解决方案是将table语句更改为数据库以添加列。我们对生产代码使用类似的方法。

即。在sqlite中:

ALTER TABLE commands ADD COLUMN favorite BOOLEAN;

或来自配置了SQLAlchemy引擎的python:

engine.execute("ALTER TABLE commands ADD COLUMN favorite BOOLEAN")

我正在用于另一个项目的替代方法 - 每次更改model.py时,我都会使用sqlalchemy engine.create_all()创建数据库模式。然后加载测试数据 - 但这对于包含生产数据的数据库来说非常繁琐。

迁移可以是一种方式(Alembic模块用于SQLAlchemy以数据库无关的方式执行此操作)。但是编写数据迁移需要付出一些努力,并且需要付出相对较大的项目。