【发布时间】:2014-08-23 22:04:29
【问题描述】:
我必须对恰好分布在同一个 MySQL 实例中的两个不同模式中的表进行一些查询。使用 SQL,这很容易,只需在表名前加上模式名(假设 a 和 be 是模式名):
SELECT upeople.id AS upeople_id
FROM a.upeople JOIN b.changes ON upeople.id = changes.changed_by
在 SQLAlchemy 中,这似乎可以使用两个引擎。在阅读文档之后,在我看来,以下代码应该可以工作(使用两个不同模式名称的棘手部分是 bingings):
from sqlalchemy import create_engine
from sqlalchemy.ext.declarative import declarative_base, DeferredReflection
from sqlalchemy.orm import sessionmaker
from sqlalchemy.orm.query import Query
Base = declarative_base(cls=DeferredReflection)
BaseId = declarative_base(cls=DeferredReflection)
class Changes(Base):
__tablename__ = 'changes'
class UPeople(BaseId):
__tablename__ = 'upeople'
database='mysql://jgb:XXX@localhost/a'
id_database='mysql://jgb:XXX@localhost/b'
engine = create_engine(database)
id_engine = create_engine(id_database)
Base.prepare(engine)
BaseId.prepare(id_engine)
bindings = {Changes: engine,
UPeople: id_engine}
Session = sessionmaker(binds=bindings)
session = Session()
q = session.query(UPeople.id).join(Changes,
UPeople.id == Changes.changed_by)
print q
但事实并非如此。当我执行 q(例如 q.all())时它失败了。 "print q" 显示一个没有模式名称的查询:
SELECT upeople.id AS upeople_id
FROM upeople JOIN changes ON upeople.id = changes.changed_by
而不是我的预期:
SELECT upeople.id AS upeople_id
FROM a.upeople JOIN b.changes ON upeople.id = changes.changed_by
我在这里错过了什么?
顺便说一句,我发现通过添加 table_args 例如在:
class Changes(Base):
__tablename__ = 'changes'
__table_args__ = {'schema': 'a'}
(对于两个表),它都有效。但是想知道为什么其他代码没有...此外,我在为表声明类时没有架构名称,这意味着我无论如何都不能使用 table_args 技巧...
所以,总结一下:如何使用来自两个模式的表进行查询,“好方法”,如果可能的话,我在声明表类时不需要包含名称,但稍后,当引擎和会话时有定义吗?
【问题讨论】:
标签: python mysql sql database sqlalchemy