2011-09-04 129 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()