将Sqlalchemy模式从mssql迁移到sqlite db?

将Sqlalchemy模式从mssql迁移到sqlite db?,sqlite,sqlalchemy,dbmigrate,Sqlite,Sqlalchemy,Dbmigrate,我所有的表类都是为mssql编写的,但现在我想在本地测试我的应用程序,所以我需要sqlitedb。有没有办法在sqlite中复制我的数据库。 我面临一些问题,比如sqlite不支持将Float作为主键。我有200多个表,我不能仅仅为了测试而编辑所有表。我可以将所有表放在一个元数据中。 我的想法是使用sqlite只是为了测试和生产,我仍然会使用mssql。 注意,我将Float改为Integer,但仍然没有创建表,而只是创建了一个空db。 我的代码 对于metadata.tables中的表: ke

我所有的表类都是为mssql编写的,但现在我想在本地测试我的应用程序,所以我需要sqlitedb。有没有办法在sqlite中复制我的数据库。 我面临一些问题,比如sqlite不支持将Float作为主键。我有200多个表,我不能仅仅为了测试而编辑所有表。我可以将所有表放在一个元数据中。 我的想法是使用sqlite只是为了测试和生产,我仍然会使用mssql。 注意,我将Float改为Integer,但仍然没有创建表,而只是创建了一个空db。 我的代码 对于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)

如果您能够更改模型代码,我建议您为
Float
创建一个
别名
,并使用它定义那些
主键
外键
列,您可以为
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)
或者,如果您只想更改
引擎
,而不想更改另一个配置变量,则可以使用方言特定的自定义类型处理:

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())

使用与生产中使用的不同的数据库系统测试代码不是一个好主意,特性差异很可能太大。我建议找到一种使用MS SQL Server进行测试的方法。测试人员正在使用mssql进行测试,但最终我只想复制数据库并执行一些功能测试。感谢我解决了这个问题,但现在我必须修复循环依赖性。我的问题通过使用use_alter=True得到了解决。我的表结构有点复杂,有太多的循环引用,通过对foregin键约束使用use_alter=True解决了这些问题。在sql alchemy网站上发现了这一点,它说明了为什么会发生循环依赖异常,它的解决方案只是在我的代码中应用了它。不,我的意思是:关于最初的问题,你采取了哪种方式?哦,我在元数据表中循环,并将所有主键类型更改为整数。