SQLAlchemy中有没有办法进行跨数据库连接.具体来说,这是我的用例:
架构
模型
我正在为模型使用声明式样式.
class Entity1(Base):
__tablename__ = 'entity1' ## I tried combination of <db>.<table> with no success
entity1_id = Column(Integer, primary_key=True)
entity2_id = Column(Integer, ForeignKey('db2.entity2.entity2_id'))
entity2 = relationship('Entity2')
class Entity2(Base):
__tablename__ = 'entity2' ## I tried combination of <db>.<table> with no success
entity2_id = Column(Integer, primary_key=True)
Run Code Online (Sandbox Code Playgroud)
现在,正如预期的那样,我对Entity1的查询失败,并显示MySQL错误消息,表示找不到表entity2.我尝试了许多不同的组合但__tablename__没有成功.所以我想知道SQLAlchemy是否可行.
在SQLite3中,有什么方法可以在主数据库中具有引用附加数据库中列的外键(反之亦然?)
我希望在多个进程之间共享附加的(只读)数据库,每个进程都有自己的(读/写)主数据库。
我这样创建父表(在数据库“ ParentDB”中):
create table Parent (id integer primary key);
Run Code Online (Sandbox Code Playgroud)
现在,我在主数据库中尝试此操作:
attach 'parent.sqlite3' as ParentDB;
create table Child (id integer not null references Parent (id),
constraint PK_Child primary key (id));
insert into ParentDB.Parent (id) values (42);
Run Code Online (Sandbox Code Playgroud)
当我尝试它时,它将创建没有错误的外键。现在,我尝试在子表中插入一行:
insert into Child (id) values (42);
Run Code Online (Sandbox Code Playgroud)
我得到这个错误:
Error: no such table: main.Parent
Run Code Online (Sandbox Code Playgroud)
因此,似乎总是假定父表和子表属于同一数据库。
同样,外键语法也不允许您指定父表所属的数据库。
有解决方法吗?
这个问题是相关的,但是这里的父表和子表都在同一个附加数据库中,而我却在单独的数据库中。
可以使用"ATTACH"语句将多个SQLite数据库连接在一起,并共同使用它们.可以使用特定于架构/文件的关键字引用每个SQLite文件中的表.这应该允许您通过文件范围来同时处理具有相同名称的多个表.我经历了一个关于如何做到这一点的非常好的教程:
http://longweekendmobile.com/2010/05/29/how-to-attach-multiple-sqlite-databases-together/
看起来我应该能够使用SQLAlchemy的表'schema'关键字来区分多个文件的连接.当我寻找一种方法来使用SQLAlchemy和通过ATTACH连接的SQLite数据库时,这是我找到的唯一例子.不幸的是,它已过时,似乎不适用于当前版本.
https://groups.google.com/forum/#!topic/sqlalchemy/QXqs4M2MjbY
我尝试使用Declarative类等更新该示例.这是我的尝试:
from sqlalchemy import *
from sqlalchemy.orm import *
from sqlalchemy.ext.declarative import *
#from sqlalchemy.pool import SingletonThreadPool
metadata = MetaData(object)
DeclarativeBase = declarative_base(metadata=metadata)
##########################################################################
# Classes
##########################################################################
class A(DeclarativeBase):
__table__ = Table('A', DeclarativeBase.metadata,
Column('id', Integer, primary_key=True, index=True, autoincrement=True),
Column('col_a', Integer, index=True))
class B(DeclarativeBase):
__table__ = Table('B', DeclarativeBase.metadata,
Column('id', Integer, primary_key=True, index=True, autoincrement=True),
Column('col_b', Integer, index=True),
schema='database_b')
#engine = create_engine('sqlite:////tmp/database_a.sqlite',echo=True, poolclass=SingletonThreadPool)
engine = create_engine('sqlite:////tmp/database_a.sqlite',echo=True)
db = engine.connect()
db.execute("ATTACH DATABASE '/tmp/database_b.sqlite' AS database_b")
DeclarativeBase.metadata.create_all(engine)
Session = sessionmaker(bind=engine)
session …Run Code Online (Sandbox Code Playgroud)