我用SQLAlchemy創建了一個表,並忘記添加一列。我基本上想這樣做:將列添加到SQLAlchemy表
users.addColumn('user_id', ForeignKey('users.user_id'))
這是什麼語法?我無法在文檔中找到它。
我用SQLAlchemy創建了一個表,並忘記添加一列。我基本上想這樣做:將列添加到SQLAlchemy表
users.addColumn('user_id', ForeignKey('users.user_id'))
這是什麼語法?我無法在文檔中找到它。
這被稱爲數據庫遷移(SQLAlchemy不支持遷移開箱即用)。你可以看一下使用sqlalchemy-migrate在這些種情況,幫助,或者你可以ALTER TABLE
通過你選擇的數據庫的命令行實用程序,
看到SQLAlchemy的文檔的這一部分:http://docs.sqlalchemy.org/en/latest/core/metadata.html#altering-schemas-through-migrations
Alembic是最新的軟件提供這種類型的功能,並由與SQLAlchemy相同的作者創建。
我有同樣的問題,並想到使用遷移庫只爲這件小事讓我
顫抖。無論如何,這是我的嘗試至今:
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請求。
我有一個名爲「ncaaf.db」的數據庫,它使用sqlite3和一個名爲「遊戲」的表構建。因此,我將光盤放入我的Linux命令提示符同一個目錄,並做
sqlite3 ncaaf.db
alter table games add column q4 type float
,這是所有需要!只要確保你在你的sqlalchemy代碼中更新你的定義。
同樣的問題在這裏。我要做的是遍歷數據庫,並將每個條目添加到具有額外列的新數據庫中,然後刪除舊數據庫並將新數據庫重命名爲該數據庫。
我有同樣的問題,我結束了在原始的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()
所以我必須遷移整個數據庫只是爲了添加一列?這聽起來不像是有趣的。謝謝! – Chris
因此,對於ALTER TABLE,我可以通過SQLAlchemy來做到嗎(即它支持直接寫SQLite)嗎? 但我會進行遷移 – Chris
不,SQLAlchemy不支持數據庫表修改,只是創建。你必須通過sqlite3來執行'ALTER'。 –