добавить столбец в таблицу SQLAlchemy - PullRequest
28 голосов
/ 04 сентября 2011

Я создал таблицу с использованием SQLAlchemy и забыл добавить столбец.Я в основном хочу сделать это:

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

Какой синтаксис для этого?Я не смог найти его в документах.

Ответы [ 8 ]

20 голосов
/ 21 июня 2013

У меня та же проблема, и мысль об использовании библиотеки миграции только для этой тривиальной вещи заставляет меня
дрожать. В любом случае, это моя попытка:

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)

Тем не менее, я не знаю, как вставить primary_key=True в необработанный запрос SQL.

17 голосов
/ 04 сентября 2011

Это называется миграцией базы данных (SQLAlchemy не поддерживает миграцию из коробки).Вы можете использовать sqlalchemy-migrate , чтобы помочь в подобных ситуациях, или вы можете просто ALTER TABLE через утилиту командной строки выбранной вами базы данных,

15 голосов
/ 26 апреля 2012

См. Этот раздел документации по SQLAlchemy: http://docs.sqlalchemy.org/en/latest/core/metadata.html#altering-schemas-through-migrations

Alembic является новейшим программным обеспечением, предлагающим этот тип функциональности, и разработано тем же автором, что и SQLAlchemy.

6 голосов
/ 16 августа 2013

У меня есть база данных с именем "ncaaf.db", созданная с помощью sqlite3, и таблица с именем "игры". Поэтому я вставляю CD в тот же каталог в командной строке Linux и выполняю

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

и это все, что нужно! Просто убедитесь, что вы обновили свои определения в коде sqlalchemy.

4 голосов
/ 27 декабря 2015

У меня была такая же проблема, я просто написал свою собственную функцию в raw sql.Если вы используете SQLITE3, это может быть полезно.

Тогда, если вы добавите столбец к определению вашего класса в то же самое время, это, похоже, поможет.

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()
0 голосов
/ 08 марта 2019
from sqlalchemy import create_engine
engine = create_engine('sqlite:///db.sqlite3')

engine.execute('alter table table_name add column column_name String')
0 голосов
/ 07 марта 2019

Продолжая простой путь, предложенный Часмани, небольшое улучшение

'''
# simple migration
# columns to add: 
# last_status_change = Column(BigInteger, default=None) 
# last_complete_phase = Column(String, default=None)  
# complete_percentage = Column(DECIMAL, default=0.0)
'''

import sqlite3

from config import APP_STATUS_DB
from sqlalchemy import types


def add_column(database_name: str, table_name: str, column_name: str, data_type: types, default=None):
    ret = False

    if default is not None:
        try:
            float(default)
            ddl = ("ALTER TABLE '{table_name}' ADD column '{column_name}' '{data_type}' DEFAULT {default}")
        except:
            ddl = ("ALTER TABLE '{table_name}' ADD column '{column_name}' '{data_type}' DEFAULT '{default}'")
    else:
        ddl = ("ALTER TABLE '{table_name}' ADD column '{column_name}' '{data_type}'")

    sql_command = ddl.format(table_name=table_name, column_name=column_name, data_type=data_type.__name__,
                             default=default)
    try:
        connection = sqlite3.connect(database_name)
        cursor = connection.cursor()
        cursor.execute(sql_command)
        connection.commit()
        connection.close()
        ret = True
    except Exception as e:
        print(e)
        ret = False
    return ret


add_column(APP_STATUS_DB, 'procedures', 'last_status_change', types.BigInteger)
add_column(APP_STATUS_DB, 'procedures', 'last_complete_phase', types.String)
add_column(APP_STATUS_DB, 'procedures', 'complete_percentage', types.DECIMAL, 0.0)
0 голосов
/ 09 ноября 2014

Та же проблема здесь. Что я сделаю, так это перебираю базу данных и добавляю каждую запись в новую базу данных с дополнительным столбцом, затем удаляю старую базу данных и переименовываю новую в эту.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...