我正在尝试使用Pandas和SQLAlchemy在MySQL实例上运行查询。在实际查询中,有一个引用特定日期的“WHERE”语句。我想分别为Python列表中的每个日期运行此查询,并将每个日期的数据帧迭代地附加到另一个主数据帧。我的代码现在看起来像这样(不包括SQLAlchemy引擎创建):
dates = ['2016-01-12','2016-01-13','2016-01-14']
for day in dates:
query="""SELECT * from schema.table WHERE date = '%s' """
df = pd.read_sql_query(query,engine)
frame.append(df)
我的错误是
/opt/rh/python27/root/usr/lib64/python2.7/site-packages/MySQLdb/cursors.pyc in execute(self, query, args)
157 query = query.encode(charset)
158 if args is not None:
--> 159 query = query % db.literal(args)
160 try:
161 r = self._query(query)
TypeError: not enough arguments for format string
我想知道将列表中的字符串插入查询字符串的最佳方法是什么?
答案 0 :(得分:3)
使用params
参数化您的查询:
dates = ['2016-01-12', '2016-01-13', '2016-01-14']
query = """SELECT * from schema.table WHERE date = %s"""
for day in dates:
df = pd.read_sql_query(query, engine, params=(day, ))
frame.append(df)
请注意,我删除了%s
占位符周围的引号 - 数据类型转换将由数据库驱动程序本身处理。如果需要,它会隐含地引用。
并且,您可以在循环之前定义查询一次 - 无需在内部执行。
我还认为您可能需要列出date
或datetime
个对象而不是字符串:
from datetime import date
dates = [
date(year=2016, month=1, day=12),
date(year=2016, month=1, day=13),
date(year=2016, month=1, day=14),
]