2014-02-21 3 views
3

Я использую pandas.io.sql выполнить сценарий SQL, который содержит КТР и хотел бы сделать что-то вроде этого:параметры переходят к SQL КТР с помощью Python панд

import pandas.io.sql as psql 
param1 = 'park' 
param2 = 'zoo' 

sqlstr = ("""WITH CTE_A AS ( 
          SELECT * 
          FROM A 
          WHERE A.Location = param1), 
        CTE_B AS (
          SELECT * 
          FROM B 
          WHERE B.Location = param2) 
      SELECT A.*, B.* 
      FROM C 
      INNER JOIN A 
      ON C.something = A.something 
      INNER JOIN B 
      ON C.something = B.something 
      WHERE C.combined = param1 || param2 
      ) 

Я хотел бы делать что-то вроде этого

result = psql.frame_query(sqlstr, con = db, params = (param1,param2)) 

Может ли мне помочь в прохождении двух параметров с помощью панд?

+0

Есть ли способ, которым мы могли бы получить трафик на это? Единственный способ, которым я знаю, как это сделать, - это использовать pyodbc для выполнения переноса данных и передачи объекта в фреймворк данных. https://code.google.com/p/pyodbc/wiki/GettingStarted#Parameters – DrBailey

ответ

1

Единственный способ, которым я знаю, как это сделать, это сделать следующее. Однако он не использует пакет psql в Pandas.

import pyodbc 
import pandas 

conn = pyodbc.connect('yourconnectionstring') 
curs = conn.cursor() 

param1 = 'park' 
param2 = 'zoo' 

sqlstr = """WITH CTE_A AS ( 
          SELECT * 
          FROM A 
          WHERE A.Location = param1), 
        CTE_B AS (
          SELECT * 
          FROM B 
          WHERE B.Location = param2) 
      SELECT A.*, B.* 
      FROM C 
      INNER JOIN A 
      ON C.something = A.something 
      INNER JOIN B 
      ON C.something = B.something 
      WHERE C.combined = ?|| ?;""" 
q = curs.execute(sqlstr,[param1,param2]).fetchall() 
df = pandas.DataFrame(q) 

curs.close() 
conn.close() 

Это передает параметры, чтобы избежать инъекции SQL и заканчивается объект DataFrame, содержащий результаты

0

При использовании pandas.io.sql в сочетании с mysql.connector синтаксис выглядит следующим образом:

import pandas.io.sql as psql 
import mysql.connector as mysql 

db = mysql.connector(host="localhost",user="user",passwd="password") 
hour = 7 
result = psql.read_sql("select * from table where 
`hour` > %(hour)s and `name` = %(name)s",con=db,params={'hour':hour,'name':'John'}) 

Так что просто введите% (name) s в запрос, замените «имя» на любое имя. И добавьте словарь для параметров.

Этот параметр добавляет '' к строке, поэтому, если вам нужно использовать его в имени таблицы, то это не сработает. Я использую регулярное выражение для очистки строки для этого. то есть

import re 
table_name = re.sub(r'[\W]', ' ',table_name) 
(use r'[\W_]' if the table name also doesn't have underscores) 
Смежные вопросы