我有一个函数应该按如下方式查询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中有类似的方式
任何建议或资源都将受到高度赞赏
答案 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的危险,这是其他人建议的。