sqlalchemy ORM:在一个查询中连接来自不同数据库的表

时间:2018-01-31 07:02:57

标签: python sql-server database orm sqlalchemy

我是sqlalchemy和orm的新手,并且在连接不同数据库的表时遇到了一些问题。

使用pandas我可以使用以下内容查询同一服务器上的多个数据库:

    engine = sqlalchemy.create_engine("some_server")
    df = pd.read_sql_query("""
             select top 10 t1.*
             from db1.dbo.table1 t1
             inner join db2.dbo.table2 t2 
                 on t1.user_id = t2.user_id
             """,
             engine
         )

我现在想用sqlalchemy的orm做类似的操作。 现在说我已经从数据库中获取了元数据信息,因此我将T1和T2作为表。如果我现在开始一个会话并创建一个查询:

    Session = sessionmaker()
    Session.configure(binds={
        T1: create_engine("server_db1"),
        T2: create_engine("server_db2")
    }
    session = Session()
    q = (session.query(T1)
                .join(T2, T1.c.user_id == T2.c.user_id)
                .limit(10)
    )

从此查询生成的结果SQL语句不会考虑引擎中指定的数据库名称,因此我将具有以下查询:

             select top 10 t1.*
             from dbo.table1 t1
             inner join dbo.table2 t2 
                 on t1.user_id = t2.user_id

当我想使用one()或all()检索结果时,会导致table2上出现无效对象名错误,因为table2仅存在于db2中。

所以我的问题是:

  1. 我创建引擎,绑定,会话是否正确?
  2. 如果无法查询来自不同数据库的表,是否可以将数据库名添加到查询字符串中,以便我仍然可以在例如查询字符串中使用查询字符串。一个pandas.read_sql_query?
  3. 我可以在表中添加一些属性,使查询可以使用完整的db.schema.table名称吗?
  4. 任何对sqlalchemy和orm有更多经验的人的建议也会受到赞赏。

0 个答案:

没有答案