2015-12-19 35 views
3

合并查询我有两个不相关类似这样的表格:蟒蛇SQLAlchemy的两个表中的

hurst = Table('Hurst', metadata, 
    Column('symbol_id' , Integer, primary_key=True), 
    Column('Date'  , String(20), nullable=False), 
    Column('symbol' , String(40), nullable=False), 
    Column('HurstExp' , Float,  nullable=False), 
) 

fundamental = Table('Fundamental', metadata, 
    Column('symbol_id' , Integer, primary_key=True), 
    Column('Date'  , String(20), nullable=False), 
    Column('symbol' , String(40), nullable=False), 
    Column('MarketCap' , Float,  nullable=False), 
) 

以下查询中的每个工作正常。我如何结合他们,所以我可以得到只有价值超过50,000,000,000公司的hurst?

# -*- coding: utf-8 -*- 
""" 
Created on Sun Dec 13 19:22:35 2015 

@author: idf 
""" 

from sqlalchemy import * 

def run(stmt): 
    rs = stmt.execute() 
    return rs 

# Let's re-use the same database as before 
dbh = create_engine('sqlite:///hurst.db') 
dbf = create_engine('sqlite:///fundamental.db') 

dbh.echo = True # We want to see the SQL we're creating 
dbf.echo = True # We want to see the SQL we're creating 

metadatah = MetaData(dbh) 
metadataf = MetaData(dbf) 

# The users table already exists, so no need to redefine it. Just 
# load it from the database using the "autoload" feature. 
hurst = Table('Hurst',  metadatah, autoload=True) 
funda = Table('Fundamental', metadataf, autoload=True) 

hurstQ = hurst.select(hurst.c.HurstExp < .5) 
run(hurstQ) 

fundaQ = funda.select(funda.c.MarketCap > 50000000000) 
run(fundaQ) 

如果我尝试使用一个连接,我得到一个错误:

j = join(hurst, funda, hurst.c.symbol == funda.c.symbol) 
stmt = select([hurst]).select_from(j) 
theJoin = run(stmt) 


Traceback (most recent call last): 
    File "/home/idf/anaconda3/lib/python3.5/site-packages/sqlalchemy/engine/base.py", line 1139, in _execute_context 
    context) 
    File "/home/idf/anaconda3/lib/python3.5/site-packages/sqlalchemy/engine/default.py", line 450, in do_execute 
    cursor.execute(statement, parameters) 

    cursor.execute(statement, parameters) 
sqlite3.OperationalError: no such table: Fundamental 

我甚至不能做简单的版本

# This will return more results than you are probably expecting. 
s = select([hurst, funda]) 
run(s) 
+0

请参阅编辑的文章。桌子是分开的。也许我需要以某种方式将它们联系起来,但两个表格是分开创建的。 – Ivan

+0

您需要使用'sqlalchemy'的'backref'功能并使用外键或关系创建另一个表的引用。 – Abhinav

回答

0

不必环境现在测试这个,但是沿着这个线应该有效:

j = join(husrt, funda, (hurst.c.symbol_id == funda.c.symbol_id) & (funda.c.MarketCap > 50000000000)) 
stmt = select([hurst]).select_from(j) 
run(stmt) 

退房sqlalchemy.sql.expression.jointhis SQL Alchemy docs page.

+0

请参阅编辑的文章。即使这个简单的东西似乎没有工作。 – Ivan

0

我不相信你可以在两个数据库之间的连接。

你的一个表是在一个数据库中,另一个是在另一个数据库:

dbh = create_engine('sqlite:///hurst.db') 
dbf = create_engine('sqlite:///fundamental.db') 

你应该把所有的表在同database.db文件,并有一个db = create_engine('sqlite:///database.db')

更正:你可以这样做:Cross database join in sqlalchemy

但你真的希望有每个表在一个单独的数据库?