我用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'。 –