0

状況は少し単純化されています。sqlalchemy-migrate用の2つの移行ファイルがあります。

Firstテーブルを作成し、それvolume_usage_cacheを自動ロードし、その列のコピーを作成して印刷します。

from sqlalchemy import Column, DateTime
from sqlalchemy import Boolean, BigInteger, MetaData, Integer, String, Table

def upgrade(migrate_engine):

    meta = MetaData()
    meta.bind = migrate_engine

    # Create new table
    volume_usage_cache = Table('volume_usage_cache', meta,
        Column('deleted', Boolean(create_constraint=True, name=None)),
        Column('id', Integer(), primary_key=True, nullable=False),
        Column('curr_write_bytes', BigInteger(), default=0),
        mysql_engine='InnoDB',
        mysql_charset='utf8'
    )

    volume_usage_cache.create()
    volume_usage_cache = Table('volume_usage_cache', meta, autoload=True)
    columns = []
    [columns.append(column.copy()) for column in volume_usage_cache.columns]
    print columns

そして、私は私が期待したものをログに記録します:

[Column('deleted', Boolean(), table=None), Column('id', Integer(), table=None,
primary_key=True, nullable=False), Column('curr_write_bytes', BigInteger(), 
table=None, default=ColumnDefault(0))]

しかし、Second移行ファイル(後に実行されるFirst)に列のコピーを作成すると、次のようになります。

from sqlalchemy import MetaData, String, Integer, Boolean, Table, Column, Index
def upgrade(migrate_engine):
    meta = MetaData()
    meta.bind = migrate_engine

    table = Table("volume_usage_cache", meta, autoload=True) 
    columns = []
    for column in table.columns:
        columns.append(column.copy())
    print columns

別の結果が得られます:

[Column('deleted', INTEGER(), table=None, default=ColumnDefault(0)), 
Column(u'id', INTEGER(), table=None, primary_key=True, nullable=False), 
Column(u'curr_write_bytes', NullType(), table=None)]

なぜcurr_write_bytes列にNullTypeがあるのですか?

4

1 に答える 1

0

2つの問題があります:

最初:Firstファイルでは、必要なタイプのすべての列がすでに含まれている古いメタデータを使用しているため、新しいMetaDataインスタンスを作成すると、SqlAlchemyはデータベースからテーブルに関する情報をロードし、Secondファイルと同じ結果を取得します。


2番目:sqlAlchemyではBigInteger列型(sqlite)はサポートされていません。また、Sqliteは列のタイプをまったくサポートしていません。したがって、列BigIntegerを使用してテーブルを作成できます(これは機能します)が、自動ロード後、そのような列のタイプは自動的にNullTypeに変換されます。

于 2012-12-11T14:47:41.667 に答える