【问题标题】:Strange error in SqlAlchemy-migrate on column.copy() with column type BigInteger .column.copy() 上的 SqlAlchemy-migrate 中出现奇怪错误,列类型为 BigInteger。
【发布时间】:2012-12-10 12:36:30
【问题描述】:

情况稍微简化了一点。我有两个用于 sqlalchemy-migrate 的迁移文件:

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?

【问题讨论】:

    标签: python sqlite migration sqlalchemy sqlalchemy-migrate


    【解决方案1】:

    有两个问题:

    首先: 在First 文件中,我们使用的旧元数据已经包含所有需要类型的列 因此,如果我们创建新的 MetaData 实例,SqlAlchemy 将从数据库中加载有关表的信息,并将获得与 Second 文件中相同的结果。


    第二: sqlAlchemy 不支持 BigInteger 列类型(在 sqlite 中)。而且 Sqlite 根本不支持列类型。所以我们可以用 BigInteger 列创建表(它会工作),但是在自动加载后,此类列的类型将自动转换为 NullType。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2015-03-09
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多