2013-05-02 32 views
0

我對數據庫中表更改的時間與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) 
+0

請描述您在哪裏以及如何添加新欄目?你是否更新了數據庫模式以反映這種變化? – vvladymyrov 2013-05-02 18:02:45

+0

我有一個名爲models.py的文件,其中我有一個從Base繼承的類,並有一個類變量「favorite = Column(Boolean())」。這是您所指的模式還是您指的是實際數據庫中的模式,這可能不反映最新的模型? – user1431282 2013-05-02 18:33:40

回答

0

聽起來像是你的數據庫可能是不同步的model.py。

快速解決方案是將表語句更改爲您的數據庫添加列。我們對生產代碼使用類似的方法。

I.e. SQLite中:

ALTER TABLE commands ADD COLUMN favorite BOOLEAN; 

或蟒蛇與SQLAlchemy的發動機配置:

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

我使用的是另一個項目的替代辦法 - 我創建使用SQLAlchemy的engine.create_all()每次model.py更改數據庫模式。然後加載測試數據 - 但這對於包含生產數據的數據庫來說很乏味。

遷移可以走(Alembic SQLAlchemy模塊以數據庫不可知的方式做到這一點)。但是寫數據遷移需要一些努力,並且支付相對較大的項目。

相關問題