2011-09-04 220 views
17

我用SQLAlchemy創建了一個表,並忘記添加一列。我基本上想這樣做:將列添加到SQLAlchemy表

users.addColumn('user_id', ForeignKey('users.user_id')) 

這是什麼語法?我無法在文檔中找到它。

回答

13

這被稱爲數據庫遷移(SQLAlchemy不支持遷移開箱即用)。你可以看一下使用sqlalchemy-migrate在這些種情況,幫助,或者你可以ALTER TABLE通過你選擇的數據庫的命令行實用程序,

+5

所以我必須遷移整個數據庫只是爲了添加一列?這聽起來不像是有趣的。謝謝! – Chris

+0

因此,對於ALTER TABLE,我可以通過SQLAlchemy來做到嗎(即它支持直接寫SQLite)嗎? 但我會進行遷移 – Chris

+6

不,SQLAlchemy不支持數據庫表修改,只是創建。你必須通過sqlite3來執行'ALTER'。 –

12

我有同樣的問題,並想到使用遷移庫只爲這件小事讓我
顫抖。無論如何,這是我的嘗試至今:

def add_column(engine, table_name, column): 
    column_name = column.compile(dialect=engine.dialect) 
    column_type = column.type.compile(engine.dialect) 
    engine.execute('ALTER TABLE %s ADD COLUMN %s %s' % (table_name, column_name, column_type)) 

column = Column('new column', String(100), primary_key=True) 
add_column(engine, table_name, column) 

不過,我不知道如何插入primary_key=True到原始的SQL請求。

4

我有一個名爲「ncaaf.db」的數據庫,它使用sqlite3和一個名爲「遊戲」的表構建。因此,我將光盤放入我的Linux命令提示符同一個目錄,並做

sqlite3 ncaaf.db 
alter table games add column q4 type float 

,這是所有需要!只要確保你在你的sqlalchemy代碼中更新你的定義。

0

同樣的問題在這裏。我要做的是遍歷數據庫,並將每個條目添加到具有額外列的新數據庫中,然後刪除舊數據庫並將新數據庫重命名爲該數據庫。

3

我有同樣的問題,我結束了在原始的SQL中寫我自己的函數。如果你使用SQLITE3,這可能會有用。

然後,如果您在同一時間將列添加到您的類定義中,它似乎可以做到這一點。

import sqlite3 

def add_column(database_name, table_name, column_name, data_type): 

    connection = sqlite3.connect(database_name) 
    cursor = connection.cursor() 

    if data_type == "Integer": 
    data_type_formatted = "INTEGER" 
    elif data_type == "String": 
    data_type_formatted = "VARCHAR(100)" 

    base_command = ("ALTER TABLE '{table_name}' ADD column '{column_name}' '{data_type}'") 
    sql_command = base_command.format(table_name=table_name, column_name=column_name, data_type=data_type_formatted) 

    cursor.execute(sql_command) 
    connection.commit() 
    connection.close()