I've the following script:
now = dt.datetime.now()
date_filter = now - timedelta(days=3)
list_ids = [1,2,3]
dq_connection = mysql.connector.connect(user='user', password='pass', host='localhost', database='db')
engine = create_engine('localhost/db')
cursor = connection.cursor(buffered=True)
query = ('''
SELECT *
FROM (SELECT * FROM myTable1 WHERE id in {%s}
WHERE date >= %s;
''')
df = pd.read_sql_query(query, connection,params=(list_ids,date_filter,))
And I want to have two filters on my query: 1) List all the IDs that I've on list_ids 2) Filter only the dates before date_filter.
The second Filter I can do it, but when I try with the list I got:
pandas.io.sql.DatabaseError: Execution failed on sql
What I am doing wrong?
Because IN
clause receives multiple values, you need to adjust prepared statement with requisite number of placeholders, %s
, and then unpack list for parameters with func(*list)
. Plus no subquery is needed for both WHERE
clauses.
query = '''SELECT * FROM myTable1
WHERE id in (%s, %s, %s) AND date >= %s;
'''
df = pd.read_sql_query(query, connection, params=(*list_ids, date_filter))
For dynamic placeholders equal to length of list, integrate a str.join
:
placeholders = ", ".join(["%s" for _ in list_ids])
query = '''SELECT * FROM myTable1
WHERE id in ({}) AND date >= %s;
'''.format(placeholders)
df = pd.read_sql_query(query, connection, params=(*list_ids, date_filter))
The technical post webpages of this site follow the CC BY-SA 4.0 protocol. If you need to reprint, please indicate the site URL or the original address.Any question please contact:yoyou2525@163.com.