而且我的評論。這是一個使用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和通配符%
您正在使用哪個驅動程序?用於傳遞參數的語法是數據庫驅動程序相關的。此外,如果您只執行完整查詢(curr_sales_month的值已填入),那麼它會返回正確的結果嗎? – joris
下面是不同格式的列表:https://www.python.org/dev/peps/pep-0249/#paramstyle,並非所有DBAPI2驅動程序都支持所有格式。 – joris
你提到了SQL服務器,但對於SQL服務器來說,變量替換%(salesmonth)的風格對我來說很陌生。在文檔中,我相信它涉及到使用圖書館psycopg2這將是Postgres – Dickster