如何在字符串中引用函数参数

时间:2016-03-15 17:21:53

标签: python sql amazon-redshift

我有一个函数应该按如下方式查询db:

def raw_disc(make):
    data_make = pd.DataFrame(disc.queryRedshift(
    """select D.model_slug,
            D.cap_engine_id,
            D.dealership_id,
            D.cash_percentage,
            D.cash_post_discount_amount as cash_post 
        from quotes_site.discounts D join quotes_site.dealerships DLR 
                on D.dealership_id = DLR.id  
        where DLR.archived <> 't' 
                 and DLR.suspended <> 't', 
                -> and DLR.make = "make"
                 group by 1,2,3,4,5"""))
    return data_make

因为查询在三引号内,所以我不能添加参数make into子句中包含的字符串DLR.make = "make"

据我记得在C中,我会做类似于&#39;%s&#39;,$ d(无法记得)在python中有类似的方式

任何建议或资源都将受到高度赞赏

2 个答案:

答案 0 :(得分:1)

我认为你想要的是这样的:

def raw_disc(make):
    data_make = pd.DataFrame(disc.queryRedshift(
    """select D.model_slug,
            D.cap_engine_id,
            D.dealership_id,
            D.cash_percentage,
            D.cash_post_discount_amount as cash_post 
        from quotes_site.discounts D join quotes_site.dealerships DLR 
                on D.dealership_id = DLR.id  
        where DLR.archived <> 't' 
                 and DLR.suspended <> 't', 
                -> and DLR.make = '{0}'
                 group by 1,2,3,4,5""".format(make)))
    return data_make

答案 1 :(得分:1)

您已将问题标记为amazon-redshift,您的代码会显示您使用Pandas。 Pandas具有将SQL查询(或整个表)的结果读入数据帧的内置功能:

http://pandas.pydata.org/pandas-docs/stable/generated/pandas.read_sql.html

如果使用与Redshift一起使用的SQLAlchemy,则可以使用pandas.read_sql的params参数和类似的方法:

  

params:list,tuple或dict,optional,default:None

     

要传递给execute方法的参数列表。用于传递参数的语法取决于数据库驱动程序。检查数据库驱动程序文档,了解支持PEP 249的paramstyle中描述的五种语法样式。例如。对于psycopg2,使用%(name)s所以使用params = {'name':'value'}

示例(假设您安装了sqlalchemy和sqlalchemy-redshift软件包):

import pandas as pd
from sqlalchemy import create_engine
engine = create_engine('redshift+psycopg2://user:password@xxx.redshift.amazonaws.com:1234/db')

name = 'test'
key = 10

df = pd.read_sql('''SELECT * FROM mytable WHERE name = %(name)s AND key > %(key)s''',
                      engine,
                      params={'name': name, 'key': key})

如果你自己去格式化字符串的路径,这可以避免SQL injection的危险,这是其他人建议的。