SQL IN-operator verwenden pyodbc-und SQL-Server
Ich bin mit pyodbc-Abfrage auf eine SQL-Server-Datenbank
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))
aber erhalte die Fehlermeldung unten. Hat das Tupel parameter müssen in einer anderen Weise behandelt? Gibt es einen besseren Weg, um die Struktur dieser Abfrage?
('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)")
UPDATE:
War ich in der Lage, diese Abfrage, um die Arbeit mit der string-Formatierung operator, die nicht ideal ist, so stellt es die Sicherheit betrifft.
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))
Du musst angemeldet sein, um einen Kommentar abzugeben.
Können Sie nicht parametrisieren mehrere Werte in einem
IN ()
- Klausel mit einem einzigen string-parameter. Der einzige Weg, um dies zu erreichen, ist:String-substitution (wie du hast).
Bauen Sie eine parametrisierte Abfrage in der form
IN (?, ?, . . ., ?)
und übergeben Sie dann in eine separate parameter für die einzelnen Platzhalter. Ich bin kein Experte in Python, ODBC-aber ich kann mir vorstellen, dass dies besonders einfach zu machen in einer Sprache wie Python. Dies ist sicherer, da man den vollen Wert der Parametrisierung.Erweitern Larry ' s zweite option dynamisch erstellen eine parametrisierte Zeichenfolge, die ich verwendet die folgenden erfolgreich:
Gibt die folgende SQL mit den entsprechenden Parametern:
Wird das problem durch das Tupel. Die ODBC-Verbindung erwartet einen string zum erstellen der Abfrage und Sie senden ein python-Tupel. Und denken Sie daran, dass Sie haben, um die Zeichenfolge zu zitieren korrekt. Ich gehe davon aus, dass die Anzahl der Bewertungen, die Sie suchen werden, variiert. Es gibt wahrscheinlich einen besseren Weg, aber meine pyodbc neigt dazu, einfach und unkompliziert.
Versuchen Sie Folgendes: