sqlalchemy将一个结果集多次过滤为不同的结果

时间:2015-11-27 16:50:54

标签: python sqlalchemy

我第一次使用sqlalchemy / python。到目前为止它很有趣。我有一个查询,我想根据原始结果集

拆分成单独的表

这是目标

base_table
id - val1 - val2 - class
1    xyc  - abc  - 1
2    lmo  - nmc  - 1
3    tre  - abc  - 2
4    hyu  - pqa  - 2

generate two new tables from the original
class_1
id - val1 - val2 - class
1    xyc  - abc  - 1
2    lmo  - nmc  - 1

class_2
id - val1 - val2 - class
3    tre  - abc  - 2
4    hyu  - pqa  - 2

伪代码

select * from remote_source into base_table

select * from base_table into class_1 where class = 1
select * from base_table into class_1 where class = 2

我已经构建了SQL,其中包含将进入base_table的所有数据。我只是不确定如何分离基表数据。这是我的实际代码(我已经删除了敏感的东西,但是有效)

    # necessary imports to drive the db recordset
import urllib

import sqlalchemy
from sqlalchemy import create_engine

import pandas

# section 01
#    relies on:
#        none
#    description
#        these are the database string variables
my_db_server = '######################'
my_db_driver = 'SQL Server Native Client 10.0'
my_db_catalog = '######################'
my_db_user = '######################'
my_db_pwd = '######################'

#section 02:
#    relies on: 
#        section 01
#    description: this is the setup for the odbc string
db_string = urllib.quote_plus("DRIVER={" + my_db_driver + "}" + \
                              ";SERVER=" + my_db_server + \
                              ";DATABASE=" + my_db_catalog + \
                              ";UID=" + my_db_user + \
                              ";PWD=" + my_db_pwd)

#section 03
#    relies on:
#        section 02
#    description:
#        this is the engine definition. it will be used in any SQL that I have to run
engine = create_engine("mssql+pyodbc:///?odbc_connect=%s" % db_string,echo = False)
connection = engine.connect()

#section 04
#    relies on: 
#        none
#    description: 
#        here are the various SQL statements stored in strings that I can use later
my_sql_estimate_data = text("select * from analytics.eo.func_EstimateData(:my_estimate)")

#section 05
#    relies on: 
#        sections 03, 04
#    description: 
#        this is the first data fetch
result = connection.execute(my_sql_estimate_data, my_estimate='3066').fetchall()

for row in result:
    print row

connection.close()

我的一个想法是使用第二个引擎构建内存表

engine = create_engine('sqlite:///:memory:', echo=True)

然后使用元数据集合来构建我需要的表,但我仍然坚持如何过滤插入的base_table。我想拥有一个基表的原因是我必须进行一次数据库调用而不是多次调用,从而提高用户性能并减少数据库工作。

我不是在寻找有人为我编写代码...我想为自己学习它,但有些想法可以查看我需要的代码。谢谢!

2 个答案:

答案 0 :(得分:0)

在Pandas中进行所有过滤然后从那里写入数据库是否可行?

答案 1 :(得分:0)

实际上,我确实找到了解决方案。我正在艰难地做事。我在想我必须制作一个模型,我可以加载数据,然后根据“类”列进行查询。更好的方法是使用我已经拥有的数据帧。下面是我用来获取所需内容的代码。我写的db函数的输出比我所需的列数多,所以我只需要抓取我想要的列并应用过滤。

hostreqs = df[['itemid','quantity','FID','primaryFacility','environment','class']]
hostreqs = hostreqs[hostreqs['class'] == 'hostReqs']
hostreqs = hostreqs[['FID','primaryFacility','environment','itemid','quantity']]

可能有一种更清洁的方式,我肯定愿意接受对这种语言不熟悉的建议。我想要做的是将过滤器添加到第一个df切片而不是第二步,但这只会很好,因为我现在有代码。感谢您的建议,toasteez。

<强>更新 我确实找到了更好的方法来完成上述代码 这是最后一次更新。我确实找到了将上述代码压缩成一行的方法:

df_hostreqs = df_estimate_details_base.loc[df_estimate_details_base['class'] == 'hostReqs',['FID','primaryFacility','environment','itemid','quantity']]

我可以制作新的数据帧。通过这种方式,我总是返回原始数据帧,只读取我想要的列