2015-09-17 108 views
1

試圖編寫一個簡單的熊貓腳本,它使用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 
+0

您正在使用哪個驅動程序?用於傳遞參數的語法是數據庫驅動程序相關的。此外,如果您只執行完整查詢(curr_sales_month的值已填入),那麼它會返回正確的結果嗎? – joris

+0

下面是不同格式的列表:https://www.python.org/dev/peps/pep-0249/#paramstyle,並非所有DBAPI2驅動程序都支持所有格式。 – joris

+0

你提到了SQL服務器,但對於SQL服務器來說,變量替換%(salesmonth)的風格對我來說很陌生。在文檔中,我相信它涉及到使用圖書館psycopg2這將是Postgres – Dickster

回答

3

而且我的評論。這是一個使用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管理工作室(或同等學歷)並輕鬆測試你的sql語法。

和結果應該是:

name database_id 
0 model   3 

所以這個例子演示了處理:日期,字符串和int數據類型。 包含LIKE和通配符%

+0

非常感謝你的答覆和道歉離開細節。我正在使用pymssql驅動程序。感謝這個例子 - 我正在讀某個傳入字符串參數的地方,使用read_sql_query有點棘手,因爲引號處理不正確。使用 」?」比在pymmsql中傳遞%s要清楚得多,我相信當與read_sql_query結合使用時,可以將傳遞的字符串作爲參數棘手,因爲它不處理引號。任何想法解決方法嗎? – Bee

+0

我的解決方法(和提示)是我從來沒有嘗試以概述的方式傳遞參數。還要注意的是,很快就會出現一個問題,它最好使用存儲過程,然後調用一個簡單的EXEC並傳遞參數。請參閱更新以瞭解如何執行內聯sql語句,如果該選項對您可用,則該技術可輕鬆適用於存儲過程調用。 – Dickster

+0

建議不要使用python的字符串格式,但應該使用DBAPI的參數替換(在這種情況下使用'?')。但@Bee,當你將字符串作爲參數傳遞時,遇到什麼問題?你能否舉一個例子或指向它所描述的地方? – joris