在Pandas

时间:2015-09-17 21:07:38

标签: sql-server-2005 pandas

尝试编写一个简单的pandas脚本,该脚本使用WHERE子句从SQL Server执行查询。但是,查询不会返回任何值。可能是因为参数未通过?我以为我们可以传递键值对,如下所示。你能指出我在这里做错了什么吗?

仅发布查询和相关内容。所有库都已根据需要导入。

  curr_sales_month = '2015-08-01'
  sql_query = """SELECT sale_month,region,oem,nameplate,Model,Segment,Sales  FROM [MONTHLY_SALES] WHERE Sale_Month = %(salesmonth)s"""
    print ("Executed SQL Extract", sql_query)

    df = pd.read_sql_query(sql_query,conn,params={"salesmonth":curr_sales_month}) 

该程序返回:        已关闭连接 - 为报告提取0行

    Process finished with exit code 0

1 个答案:

答案 0 :(得分:4)

继续我的评论。下面是一个使用pyodbc与sql server通信并演示传递变量的示例。

import pandas as pd
import pyodbc
pd.set_option('display.max_columns',50)
pd.set_option('display.width',5000)

conn_str = r"DRIVER={0};SERVER={1};DATABASE={2};UID={3};PWD={4}".format("SQL Server",'.','master','user','pwd')
cnxn = pyodbc.connect(conn_str)
sql_statement = "SELECT * FROM sys.databases WHERE database_id = ?"
df = pd.read_sql_query(sql = sql_statement, con = cnxn, params = [2])
cnxn.close()
print df.iloc[:,0:2].head()

产生:

     name  database_id 
0  tempdb            2 

如果您希望传递多个参数:

sql_statement = "SELECT * FROM sys.databases WHERE database_id > ? and database_id < ?"
df = pd.read_sql_query(sql = sql_statement, con = cnxn, params = [2,5])
cnxn.close()
print df.iloc[:,0:2].head()

产生:

    name  database_id
0  model            3
1   msdb            4

我使用动态内联sql语句的首选方法

create_date = '2015-01-01'
name = 'mod'

sql_statement_template = r"""SELECT * FROM sys.databases WHERE database_id > {0} AND database_id < {1} AND create_date > '{2}' AND name LIKE '{3}%'"""
sql_statement = sql_statement_template.format('2','5',create_date,name)
print sql_statement 

产量

SELECT * FROM sys.databases WHERE database_id > 2 AND database_id < 5 AND create_date > '2015-01-01' AND name LIKE 'mod%'

如果您打印出来的另一个好处是,您可以将sql commnand复制并粘贴到management studio(或等效的)并轻松测试您的sql语法。

,结果应为:

    name  database_id
0  model            3

因此,此示例演示了处理:date,string和int数据类型。 包含LIKE和通配符%