循环遍历Python查询字符串中的日期列表

时间:2016-02-01 16:49:41

标签: python mysql pandas sqlalchemy

我正在尝试使用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

我想知道将列表中的字符串插入查询字符串的最佳方法是什么?

1 个答案:

答案 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占位符周围的引号 - 数据类型转换将由数据库驱动程序本身处理。如果需要,它会隐含地引用。

并且,您可以在循环之前定义查询一次 - 无需在内部执行。

我还认为您可能需要列出datedatetime个对象而不是字符串:

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