【问题标题】:Pass parameters to SQL CTEs using Python Pandas使用 Python Pandas 将参数传递给 SQL CTE
【发布时间】:2014-03-23 06:40:32
【问题描述】:

我正在使用 pandas.io.sql 来执行一个包含 CTE 的 SQL 脚本,并且想做这样的事情:

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))

谁能帮助我使用 Pandas 传递这两个参数?

【问题讨论】:

标签: python sql pandas common-table-expression


【解决方案1】:

当结合使用 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,将 'name' 替换为您想要的任何名称。并为 params 添加一个字典。

我这个选项确实将''添加到字符串中,所以如果你需要在表名中使用它,那么这不起作用。我使用正则表达式来清理字符串。即

import re
table_name = re.sub(r'[\W]', ' ',table_name)
(use r'[\W_]' if the table name also doesn't have underscores)

【讨论】:

    【解决方案2】:

    我知道如何执行此类操作的唯一方法是执行以下操作。但是它没有利用 Pandas 中的 psql 包。

    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 对象结束

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2014-12-08
      • 2017-11-18
      • 1970-01-01
      • 2021-10-23
      • 1970-01-01
      • 2017-08-31
      • 2014-02-01
      • 2014-02-13
      相关资源
      最近更新 更多