web-dev-qa-db-ja.com

SQLAlchemyテーブルに列を追加

SQLAlchemyを使用してテーブルを作成し、列を追加するのを忘れました。私は基本的にこれをやりたい:

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

これの構文は何ですか?私はドキュメントでそれを見つけることができませんでした。

30
Chris

これは、データベース移行と呼ばれます(SQLAlchemyは、そのままの移行をサポートしていません)。 sqlalchemy-migrate を使用してこのような状況を支援するか、またはALTER TABLE選択したデータベースのコマンドラインユーティリティを使用して、

17
Demian Brecht

私は同じ問題を抱えており、この些細なことだけに移行ライブラリを使用することを考えると、
震える。とにかく、これはこれまでの私の試みです:

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要求に挿入する方法がわかりません。

24
AlexP

SQLAlchemyドキュメントのこのセクションを参照してください。 http://docs.sqlalchemy.org/en/latest/core/metadata.html#altering-schemas-through-migrations

Alembic は、このタイプの機能を提供する最新のソフトウェアであり、SQLAlchemyと同じ作成者によって作成されています。

15
Mike

Sqlite3で構築された「ncaaf.db」というデータベースと「games」というテーブルがあります。だから私はLinuxコマンドプロンプトの同じディレクトリにCDを入れて

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

それだけで十分です! sqlalchemyコードの定義を必ず更新してください。

6
appleLover
from sqlalchemy import create_engine
engine = create_engine('sqlite:///db.sqlite3')

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

Chasmaniによって提案された単純な方法を続けるだけで、ほとんど改善されません

'''
# 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
LittleEaster