estoy usando pyodbc a consulta a una base de datos SQL ServerSQL en el operador usando pyodbc y SQL Server
import datetime
import pyodbc
conn = pyodbc.connect("Driver={SQL Server};Server='dbserver',Database='db',
TrustedConnection=Yes")
cursor = conn.cursor()
ratings = ("PG-13", "PG", "G")
st_dt = datetime(2010, 1, 1)
end_dt = datetime(2010, 12, 31)
cursor.execute("""Select title, director, producer From movies
Where rating In ? And release_dt Between ? And ?""",
ratings, str(st_dt), str(end_dt))
pero estoy recibiendo el error abajo. ¿El parámetro de tupla necesita ser manejado de una manera diferente? ¿Hay una mejor manera de estructurar esta consulta?
('42000', "[42000] [Microsoft][ODBC SQL Server Driver][SQL Server]Line 9:
Incorrect syntax near '@P1'. (170) (SQLExecDirectW);
[42000] [Microsoft][ODBC SQL Server Driver][SQL Server]
Statement(s) could not be prepared. (8180)")
ACTUALIZACIÓN:
que era capaz de conseguir esta consulta a trabajar usando el operador de la cadena de formato, que no es ideal, ya que presenta problemas de seguridad.
import datetime
import pyodbc
conn = pyodbc.connect("Driver={SQL Server};Server='dbserver',Database='db',
TrustedConnection=Yes")
cursor = conn.cursor()
ratings = ("PG-13", "PG", "G")
st_dt = datetime(2010, 1, 1)
end_dt = datetime(2010, 12, 31)
cursor.execute("""Select title, director, producer From movies
Where rating In %s And release_dt Between '%s' And '%s'""" %
(ratings, st_dt, end_dt))
Para su segunda opción, sería necesario crear dinámicamente la declaración SQL en función del tamaño de la tupla deseada para pasar a la instrucción IN? – user338714
Puede hacer algo como: cursor.execute ("SELECT * FROM películas DONDE calificación IN ({})". format (','. join ('?' * len (ratings))) , calificaciones) – rleelr