2011-09-04 13 views
17

Ho creato una tabella utilizzando SQLAlchemy e ho dimenticato di aggiungere una colonna. Fondamentalmente voglio fare questo:aggiungi colonna a SQLAlchemy Tabella

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

Qual è la sintassi per questo? Non riuscivo a trovarlo nei documenti.

risposta

13

Si parla di migrazione del database (SQLAlchemy non supporta la migrazione out of the box). È possibile guardare con sqlalchemy-migrate di aiutare in questo tipo di situazioni, o si può semplicemente ALTER TABLE tramite linea di comando del database scelto,

+5

Quindi devo migrare l'intero database solo per aggiungere una colonna? Non sembra divertente. Grazie! – Chris

+0

Quindi per ALTER TABLE, posso farlo tramite SQLAlchemy (ad esempio, supporta la scrittura di SQLite diretto)? Ma avrò la migrazione – Chris

+6

No, SQLAlchemy non supporta la modifica della tabella del database, solo la creazione. Dovrai fare 'ALTER' tramite sqlite3. –

12

Ho lo stesso problema, e un pensiero di utilizzare la libreria di migrazione solo per questa cosa banale mi fa tremare
. Ad ogni modo, questo è il mio tentativo finora:

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) 

Eppure, non so come inserire primary_key=True nella richiesta SQL prime.

4

Ho un database chiamato "ncaaf.db" creato con sqlite3 e una tabella chiamata "giochi". Così vorrei CD nella stessa directory sul mio prompt di comando Linux e fare

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

e questo è tutto ciò che serve! Assicurati di aggiornare le definizioni nel codice sqlalchemy.

0

Lo stesso problema qui. Quello che farò è iterare il db e aggiungere ogni voce a un nuovo database con la colonna extra, quindi eliminare il vecchio db e rinominare il nuovo in questo.

3

Ho avuto lo stesso problema, ho finito solo scrivendo la mia funzione in raw sql. Se stai usando SQLITE3 questo potrebbe essere utile.

Quindi se si aggiunge la colonna alla definizione della classe allo stesso tempo sembra che faccia il trucco.

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() 
Problemi correlati