ajouter une colonne à la Table SQLAlchemy
j'ai fait une table en utilisant SQLAlchemy et j'ai oublié d'ajouter une colonne. En gros, je veux faire ceci:
users.addColumn('user_id', ForeignKey('users.user_id'))
Quelle est la syntaxe pour cela? Je ne pouvais pas le trouver dans les docs.
6 réponses
ceci est appelé migration de base de données (SQLAlchemy ne supporte pas la migration hors de la boîte). Vous pouvez rechercher à l'aide de sqlalchemy-migrer pour aider dans ce genre de situations, ou vous pouvez juste ALTER TABLE
via l'utilitaire en ligne de commande de votre base de données choisie,
j'ai le même problème, et une pensée d'utiliser la bibliothèque de migration seulement pour cette chose triviale me fait
trembler. Quoi qu'il en soit, c'est ma tentative jusqu'à présent:
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)
Encore, je ne sais pas comment insérer primary_key=True
dans la requête SQL brute.
voir cette section de la documentation de SQLAlchemy: http://docs.sqlalchemy.org/en/latest/core/metadata.html#altering-schemas-through-migrations
Alambic est le dernier logiciel à offrir ce type de fonctionnalité et est fait par le même auteur que SQLAlchemy.
j'ai une base de données appelée "ncaaf.db" construit avec sqlite3 et une table appelée "jeux". Donc, je CD dans le même répertoire sur mon invite de commande linux et faire
sqlite3 ncaaf.db
alter table games add column q4 type float
et c'est tout ce qu'il faut! Assurez-vous de mettre à jour vos définitions dans votre code sqlalchemy.
j'ai eu le même problème, j'ai fini d'écrire ma propre fonction en sql brut. Si vous utilisez SQLITE3, cela pourrait être utile.
alors si vous ajoutez la colonne à votre définition de classe en même temps cela semble faire l'affaire.
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()
Même problème ici. Ce que je vais faire est itérer sur la base de données et ajouter chaque entrée à une nouvelle base de données avec la colonne supplémentaire, puis supprimer l'ancienne base de données et renommer le nouveau à celui-ci.