53 votes

ajouter une colonne à la table SQLAlchemy

J'ai créé une table en utilisant SQLAlchemy et j'ai oublié d'ajouter une colonne. Je veux essentiellement faire ceci :

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

Quelle est la syntaxe pour cela ? Je ne l'ai pas trouvée dans la documentation.

2 votes

Un peu en rapport : sqlalchemy.Table a .append_column() y append_constraint() . Ceci est utile pour construire les métadonnées de sqlalchemy dans des appels séparés, mais pas pour modifier les objets de la base de données (pour lesquels vous avez besoin de migrations, comme indiqué dans les réponses à cette question).

54voto

AlexP Points 339

J'ai le même problème, et la pensée d'utiliser la bibliothèque de migration uniquement 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_name', String(100), primary_key=True)
add_column(engine, table_name, column)

Pourtant, je ne sais pas comment insérer primary_key=True en requête SQL brute.

3 votes

column.type.compile(engine.dialect) est ce que je cherchais. Je ne l'ai trouvé nulle part ailleurs.

0 votes

Comme cela fait plus de sept ans, j'ai prolongé un peu cette réponse... stackoverflow.com/a/65874034/2558739

30voto

Demian Brecht Points 11083

C'est ce qu'on appelle la migration de la base de données (SQLAlchemy ne prend pas en charge la migration dès le départ). Vous pouvez envisager d'utiliser sqlalchemy-migrate pour aider dans ce genre de situation, ou vous pouvez simplement ALTER TABLE par l'intermédiaire de l'utilitaire de ligne de commande de la base de données que vous avez choisie,

14 votes

Je dois donc migrer l'ensemble de la base de données juste pour ajouter une colonne ? Cela n'a pas l'air très amusant. Merci !

0 votes

Donc, pour ALTER TABLE, puis-je le faire via SQLAlchemy (c'est-à-dire qu'il prend en charge l'écriture directe de SQLite) ? Mais je vais m'occuper de la migration

15 votes

Non, SQLAlchemy ne prend pas en charge la modification des tables de la base de données, seulement la création. Vous devrez faire le ALTER à travers sqlite3.

25voto

Mike Points 920

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 réalisé par le même auteur que SQLAlchemy.

2 votes

L'extension de Flask, Flask-Migrate, utilise également Alembic, je pense que cela devrait être une bonne solution.

11voto

appleLover Points 680

J'ai une base de données appelée "ncaaf.db" construite avec sqlite3 et une table appelée "games". Je vais donc aller 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 simplement de mettre à jour vos définitions dans votre code sqlalchemy.

0 votes

La réponse est simple. Il faut plus de votes. Assurez-vous simplement que vous avez le shell de ligne de commande sqlite. sqlite.org/download.html .

0 votes

Le texte suivant a fonctionné pour moi comme deuxième ligne : ALTER TABLE games ADD COLUMN q4 FLOAT ;

5voto

Roger Hayashi Points 41
from sqlalchemy import create_engine
engine = create_engine('sqlite:///db.sqlite3')

engine.execute('alter table table_name add column column_name String')

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X