【问题标题】:Migrate Sqlalchemy schema from mssql to sqlite db?将 Sqlalchemy 架构从 mssql 迁移到 sqlite db?
【发布时间】:2014-07-03 11:16:03
【问题描述】:

我的所有表类都是为 mssql 编写的,但现在我想在本地测试我的应用程序,所以我需要 sqlitedb。有没有一种方法可以在 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)

【问题讨论】:

  • 使用与生产环境不同的数据库系统测试代码不是一个好主意,功能差异很可能会太大。我建议找到一种使用 MS SQL Server 进行测试的方法。
  • 测试人员正在使用 mssql 对其进行测试,但最终我只想复制数据库并执行一些功能测试。

标签: sqlite sqlalchemy dbmigrate


【解决方案1】:

如果您能够更改模型代码,我建议创建一个 aliasFloat 并使用它来定义那些 primary_keyForeignKey 列,您可以为您的 @ 进行更改987654326@测试:

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

【讨论】:

  • 谢谢我解决了这个问题,但现在我必须修复循环依赖。
  • 使用 use_alter=True 解决了我的问题。我的表结构有点复杂,有太多的循环引用通过使用 use_alter = True 来解决外键约束。
  • 在 sql alchemy 网站上找到了这个,它说明了为什么会发生循环依赖异常,它的解决方案只是在我的代码中应用了它。 docs.sqlalchemy.org/en/rel_0_7/core/exceptions.html
  • 不,我的意思是:您对最初的问题采取了哪种方式?
  • 哦,我遍历了元数据中的表并将所有主键类型更改为整数。
猜你喜欢
  • 2020-06-17
  • 2018-09-29
  • 1970-01-01
  • 1970-01-01
  • 2017-06-21
  • 2016-06-22
  • 2014-09-03
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多