2011-09-04 30 views
17

Hice una tabla con SQLAlchemy y olvidé agregar una columna. Básicamente quiero hacer esto:agregar columna a SQLAlchemy Tabla

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

¿Cuál es la sintaxis para esto? No pude encontrarlo en los documentos.

Respuesta

13

Esto se conoce como migración de base de datos (SQLAlchemy no es compatible con migración fuera de la caja). Puede buscar en el uso sqlalchemy-migrate para ayudar en este tipo de situaciones, o puede simplemente ALTER TABLE través de utilidad de línea de comandos de su base de datos elegida,

+5

¿Debo migrar toda la base de datos solo para agregar una columna? Eso no suena divertido. ¡Gracias! – Chris

+0

Entonces, para ALTER TABLE, ¿puedo hacerlo a través de SQLAlchemy (es decir, admite escribir SQLite directamente)? Pero me ocuparé de la migración – Chris

+6

No, SQLAlchemy no admite la modificación de la tabla de la base de datos, solo la creación. Tendrás que hacer el 'ALTER' a través de sqlite3. –

12

Tengo el mismo problema, y ​​una idea de utilizar la biblioteca de migración solo para esta cosa trivial me hace
temblar. De todos modos, este es mi intento hasta el momento:

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) 

Aún así, no sé cómo insertar primary_key=True a petición SQL en bruto.

4

Tengo una base de datos llamada "ncaaf.db" construida con sqlite3 y una tabla llamada "juegos". Así que lo haría CD en el mismo directorio en mi línea de comandos Linux y hacer

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

y eso es todo lo que se necesita! Solo asegúrate de actualizar tus definiciones en tu código sqlalchemy.

0

El mismo problema aquí. Lo que haré es iterar sobre el db y agregar cada entrada a una nueva base de datos con la columna adicional, luego eliminar el db anterior y cambiar el nombre del nuevo a este.

3

Tuve el mismo problema, terminé simplemente escribiendo mi propia función en raw sql. Si está utilizando SQLITE3, esto podría ser útil.

Luego, si agrega la columna a la definición de su clase al mismo tiempo, parece hacer el truco.

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() 
Cuestiones relacionadas