Я сделал таблицу с использованием SQLAlchemy и забыл добавить столбец. Я в основном хочу это сделать:
users.addColumn('user_id', ForeignKey('users.user_id'))
Какой синтаксис для этого? Я не мог найти его в документах.
Я сделал таблицу с использованием SQLAlchemy и забыл добавить столбец. Я в основном хочу это сделать:
users.addColumn('user_id', ForeignKey('users.user_id'))
Какой синтаксис для этого? Я не мог найти его в документах.
Это называется миграцией базы данных (SQLAlchemy не поддерживает перенос из коробки). Вы можете посмотреть sqlalchemy-migrate, чтобы помочь в таких ситуациях, или просто ALTER TABLE
через вашу выбранную утилиту командной строки базы данных,
У меня та же проблема, и мысль об использовании библиотеки миграции только для этой тривиальной вещи заставляет меня дрожать. Во всяком случае, это моя попытка:
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-запрос.
Смотрите этот раздел документации SQLAlchemy: http://docs.sqlalchemy.org/en/latest/core/metadata.html#altering-schemas-through-migrations
Alembic - это новейшее программное обеспечение, предлагающее этот тип функциональности и сделанный тем же автором, что и SQLAlchemy.
У меня есть база данных под названием "ncaaf.db", построенная с использованием sqlite3 и таблицей "игры". Поэтому я бы записал CD в тот же каталог в командной строке linux и сделал
sqlite3 ncaaf.db
alter table games add column q4 type float
и это все, что нужно! Просто убедитесь, что вы обновили свои определения в своем коде sqlalchemy.
У меня была такая же проблема, я закончил тем, что просто написал свою собственную функцию в 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()
Такая же проблема здесь. То, что я сделаю, это повторить по db и добавить каждую запись в новую базу данных с дополнительным столбцом, а затем удалить старый db и переименовать новое в это.