gpt4 book ai didi

python - sqlalchemy:在同一文件中创建两个数据库

转载 作者:行者123 更新时间:2023-12-01 01:25:17 25 4
gpt4 key购买 nike

我正在尝试使用 SQLAlchemy 在单个文件中创建两个单独的数据库。这是我到目前为止的代码:

from sqlalchemy import create_engine, Column, String, Integer, inspect
from sqlalchemy.ext.declarative import declarative_base

Base = declarative_base()

class Table1(Base):
__tablename__ = 'table_1'
id = Column(Integer, primary_key=True)
name = Column(String)

class Table2(Base):
__tablename__ = 'table_2'
id = Column(Integer, primary_key=True)
name = Column(String)


engine1 = create_engine('sqlite:///db1.db')
engine2 = create_engine('sqlite:///db2.db')
Base.metadata.drop_all(bind=engine1)
Base.metadata.drop_all(bind=engine2)
Base.metadata.create_all(bind=engine1)
Base.metadata.create_all(bind=engine2)

print(inspect(engine1).get_table_names())
# ['table_1', 'table_2']
print(inspect(engine2).get_table_names())
# ['table_1', 'table_2']

我只想在 db1 中创建 Table1,在 db2 中仅创建 Table2;但是,我在两个数据库中都获取了两个表。

是否有办法解决此问题,或者我是否需要在两个单独的文件中创建数据库。

最佳答案

您的问题不是由于尝试在同一模块中创建两个数据库而引起的。相反,您是在映射两个表的同一个元数据对象上调用 create_all()。例如

print(Base.metadata.tables)

结果:

dict_keys(['table_1', 'table_2'])

来自docs关于MetaData.create_all():

This method will issue queries that first check for the existence of each individual table, and if not found will issue the CREATE statements...

关键点是它检查每个表是否存在。所以这里:

Base.metadata.create_all(bind=engine1)
Base.metadata.create_all(bind=engine2)

...它首先检查engine1引用的数据库中的两个表,没有找到它们并创建它们。然后,它检查 engine2 引用的数据库中的两个表,没有找到它们,然后创建它们。

有几个选项。

每个数据库都有不同的基础对象(即不同的元数据实例):

Base1 = declarative_base()
Base2 = declarative_base()


class Table1(Base1):
__tablename__ = 'table_1'
id = Column(Integer, primary_key=True)
name = Column(String)

class Table2(Base2):
__tablename__ = 'table_2'
id = Column(Integer, primary_key=True)
name = Column(String)

engine1 = create_engine('sqlite:///db1.db')
engine2 = create_engine('sqlite:///db2.db')
Base1.metadata.drop_all(bind=engine1)
Base2.metadata.drop_all(bind=engine2)
Base1.metadata.create_all(bind=engine1)
Base2.metadata.create_all(bind=engine2)

print(inspect(engine1).get_table_names())
# ['table_1']
print(inspect(engine2).get_table_names())
# ['table_2']

或者,在绑定(bind)到所需引擎时有选择地创建表:

Base = declarative_base()

class Table1(Base):
__tablename__ = 'table_1'
id = Column(Integer, primary_key=True)
name = Column(String)

class Table2(Base):
__tablename__ = 'table_2'
id = Column(Integer, primary_key=True)
name = Column(String)


engine1 = create_engine('sqlite:///db1.db')
engine2 = create_engine('sqlite:///db2.db')
Base.metadata.drop_all(bind=engine1)
Base.metadata.drop_all(bind=engine2)
Base.metadata.tables['table_1'].create(bind=engine1)
Base.metadata.tables['table_2'].create(bind=engine2)

print(inspect(engine1).get_table_names())
# ['table_1']
print(inspect(engine2).get_table_names())
# ['table_2']

关于python - sqlalchemy:在同一文件中创建两个数据库,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/53419236/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com