将Sqlalchemy架构从mssql迁移到sqlite db?

时间:2014-07-03 11:16:03

标签: sqlite sqlalchemy dbmigrate

我有为mssql编写的所有表类,但现在我想在本地测试我的应用程序,所以我需要sqlitedb.Is有一种方法,我可以在sqlite中复制我的数据库。 我面临一些问题,比如sqlite不支持Float作为主键。我有200多个表,我不能去编辑所有只是为了测试。我可以将所有表都放在一个元数据中。 我的想法是使用sqlite进行测试和生产,我仍然会使用mssql。 注意我将Float更改为Integer,但仍然没有创建我的表,而只是创建一个空数据库。 我的代码 对于metadata.tables中的表:

keys_to_change = []
for pkey_column in metadata.tables[table].primary_key.columns.keys():
            keys_to_change.append(pkey_column)

for data in list(metadata.tables[table].foreign_keys):
            keys_to_change.append(data.column.name)

for column in metadata.tables[table].columns:
            if column.name in keys_to_change:

                if str(column.type) == 'FLOAT':            
                    column.type = INTEGER
engine = create_engine('sqlite:///mytest.db', echo=True, echo_pool=True)
metadata.create_all(engine)

1 个答案:

答案 0 :(得分:1)

如果您能够更改型号代码,我建议您为alias创建Float并使用它来定义primary_keyForeignKey列,您可以更改sqlite测试:

# CONFIGURATION
PKType = Float # default: MSSQL; or Float(N, M)
# PKType = Integer # uncomment this for sqlite

,您的模型如下所示:

class MyParent(Base):
    __tablename__ = 'my_parent'
    id = Column(PKType, primary_key=True)
    name = Column(String)
    children = relationship('MyChild', backref='parent')

class MyChild(Base):
    __tablename__ = 'my_child'
    id = Column(PKType, primary_key=True)
    parent_id = Column(PKType, ForeignKey('my_parent.id'))
    name = Column(String)

或者,如果您只想更改engine而不是其他配置变量,则可以使用特定于方言的自定义类型处理:

import sqlalchemy.types as types
class PKType(types.TypeDecorator):
    impl = Float
    def load_dialect_impl(self, dialect):
        if dialect.name == 'sqlite':
            return dialect.type_descriptor(Integer())
        else:
            return dialect.type_descriptor(Float())