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.

21
demandé sur Phillip 2011-09-04 21:32:43

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,

17
répondu Demian Brecht 2011-09-04 17:35:40

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.

15
répondu AlexP 2016-09-16 16:16:54

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.

13
répondu Mike 2017-12-08 16:55:53

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.

6
répondu appleLover 2013-08-16 18:26:34

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()
3
répondu chasmani 2018-01-07 18:27:24

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.

0
répondu sharpshadow 2014-11-09 17:26:58