How can I bind a list to a parameter in a custom query in sqlalchemy?
psycopg2
now supports type adaptation, which allows, among other things, the ability to pass a list into a single parameterized value in the query. This also works in SQLAlchemy, at the very least for raw-SQL-esque queries to a PostgreSQL database (I don't have access to other database types, so I don't know if sqlalchemy
will respect this convention for other databases, but my inclinationcitation needed is that it will work).
some_ids = [1, 2, 3, 4]
query = "SELECT * FROM my_table t WHERE t.id = ANY(:ids);"
conn.execute(sqlalchemy.text(query), ids=some_ids)
## runs just fine
I found that without the wrapper call to sqlalchemy.text
, it gave a ProgrammingError: syntax error at or near ":"
.
Try it without the parentheses around, :iddata
. That has been working for me.
sql_tmpl = """delete from Data where id_data in :iddata """
A new approach to this problem that works for any database (not just relying on psycopg2's type adaptation) uses expanding bind parameters:
sql_tmpl = """delete from Data where id_data in :iddata"""
params = { 'iddata': [1, 2, 3, 4], }
# session is a session object from sqlalchemy
t = text(sql_tmpl)
t = t.bindparams(bindparam('iddata', expanding=True))
self.session.execute(t, params)
Use a tuple instead of a list and you don't need parentheses around the parameter in the query:
sql_tmpl = "delete from Data where id_data in :iddata"
params = {
'iddata':(1, 2, 3, 4),
}
self.session.execute(text(sql_tmpl), params)