我有为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)
答案 0 :(得分:1)
如果您能够更改型号代码,我建议您为alias
创建Float
并使用它来定义primary_key
和ForeignKey
列,您可以更改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())