sqlalchemy / pandas - 如何创建sqlalchemy`selectable`以传递给pd.read_sql?

时间:2016-09-21 02:23:49

标签: python pandas sqlalchemy

我对sqlalchemy完全不熟悉,而且我一直在努力更好地理解如何使用pd.read_sql

我成功地运行了以下内容:

import sqlalchemy as sa
import pandas as pd
df = pd.DataFrame( index=range(10,30), data=np.random.rand(20, 10) )
eng = sa.create_engine('sqlite:///test.db')
df.reset_index().to_sql('test_table', eng, index=False)
df2 = pd.read_sql( 'test_table' , eng ) # Don't understand this function

我已经发现我可以通过将表名作为pd.read_sql的第一个参数传递来加载我存储在表中的任何内容,但如果我只想加载列{{1}的元素,该怎么办? }大于某个数字。

问题

如何为index的第一个参数创建sqlalchemy selectable以仅加载数据库/表的子集?

注释: 在这种情况下,我知道在加载df2之后这是微不足道的,但如果db的大小非常大,我想避免首先在内存中加载整个db。

1 个答案:

答案 0 :(得分:0)

以三种不同的方式获得表格。 (不确定区别是什么)。

然后在该表上使用.select()方法,该结果上的.where得到了我想要的结果。

import sqlalchemy as sa
eng = sa.create_engine('sqlite:///test.db')
# First way to load table
m = sa.MetaData()
m.reflect(bind=eng)
t1 = m.tables['test_table']

# Second way
m2 = sa.MetaData(bind=eng)
t2 = sa.Table('test_table', m2, autoload=True)

# Third way
t3 = sa.Table('test_table', sa.MetaData(), autoload_with=eng)

# I can then use either of the t's to do the following
df3 = pd.read_sql(t.select().where(t.c.index > 15), eng)