2012-05-28 13 views
7

sto provando ottenere informazioni da un database SQL utilizzando pythoncome gestire una stringa dell'istruzione lungo SQL in Python

sono stato in grado di connettersi e recuperare i dati quando l'istruzione SQL era semplice come

#cursor.execute("SELECT * FROM Client WHERE UsesTimesheet = 1 ORDER BY ClientName") 

Tuttavia quando mi trasferisco in una dichiarazione più complessa ottengo l'errore mostrato di seguito

Traceback (most recent call last): 
File "F:\Python\Test - AutoCad.py", line 30, in <module> 
where jobnum = 1205992") 
File "C:\Python26\ArcGIS10.0\lib\site-packages\pymssql.py", line 196, in execute 
raise OperationalError, e[0] 
OperationalError: SQL Server message 102, severity 15, state 1, line 1: 
Incorrect syntax near 'jobnum'. 

Questa istruzione funziona quando si utilizza client di Microsoft SQL 2008, ma non in pitone.

Cosa sto facendo in modo errato? Per istruzioni complesse dovrei usare SQLAlchemy?

http://www.sqlalchemy.org/

codice corrente al di sotto

import pymssql 
import _mssql 
import sys 

# Connect to db using Windows Integrated Authentication. 
conn = _mssql.connect(server='000.000.0.0', database='Mydb', trusted=True) 
conn = pymssql.connect(host='000.000.0.0', database='Mydb', trusted=True) 

# prepare a cursor object using cursor() method 
cursor = conn.cursor() 

cursor.execute("""SELECT PJI.*, PJO.*, 
     CST.ABCGS 
FROM dbo.Traverse AS TRE 
       LEFT OUTER JOIN dbo.TraversePreEntry AS TPE 
        ON TRE.JobNum = dbo.GetJobNumberFromGroupId(TPE.GroupId) 
       LEFT OUTER JOIN AutoCADProjectInformation AS PJI 
        ON TRE.JobNum = PJI.JobNumber 
       LEFT OUTER JOIN CalculationStorageReplacement AS CST 
        ON CST.ProjectNumber = dbo.GetJobNumberFromGroupId(TPE.GroupId 
       LEFT OUTER JOIN dbo.TraverseElevations AS TEV 
        ON TRE.TraverseId = TEV.TraverseId 
       LEFT OUTER JOIN VGSDB.dbo.ProjectOffice AS PJO 
        ON PJI.PjbId = PJO.PjbId 
where jobnum = 1205992""") 

# Fetch rows 
data = cursor.fetchall() 

print "Info : %s " % str(data) 
+0

Vedere sopra ..... –

risposta

11

La stringa Python viene unita insieme senza una nuova riga, quindi non c'è spazio prima della parola chiave where. Meglio utilizzare stringhe triple-citato quando si lavora con le stringhe multilinea:

cursor.execute("""\ 
SELECT PJI.*, PJO.*, 
     CST.ABCGS 
FROM dbo.Traverse AS TRE 
       LEFT OUTER JOIN dbo.TraversePreEntry AS TPE 
        ON TRE.JobNum = dbo.GetJobNumberFromGroupId(TPE.GroupId) 
       LEFT OUTER JOIN AutoCADProjectInformation AS PJI 
        ON TRE.JobNum = PJI.JobNumber 
       LEFT OUTER JOIN CalculationStorageReplacement AS CST 
        ON CST.ProjectNumber = dbo.GetJobNumberFromGroupId(TPE.GroupId) 
       LEFT OUTER JOIN dbo.TraverseElevations AS TEV 
        ON TRE.TraverseId = TEV.TraverseId 
       LEFT OUTER JOIN VGSDB.dbo.ProjectOffice PJO 
        ON PJI.PjbId = PJO.PjbId 
where jobnum = 1205992""") 

stringhe triple-citato mantenere newlines:

>>> "one\ 
... two" 
"onetwo" 
>>> """one 
... two""" 
"one\ntwo" 

Se questo è un one-di voi non hanno necessariamente bisogno di utilizzare SQLAlchemy, ma man mano che il progetto cresce, scoprirai che quella libreria offre molti vantaggi, incluso rendere la logica condizionale molto più semplice (aggiungendo ulteriori clausole WHERE basate su if/then branches, ecc.).

+1

+1 per stringhe con quotatura tripla. – dusan

3

inserire uno spazio prima della parola chiave where. Python non aggiunge spazi quando si usa \:

In [5]: print "a\ 
    ...: b" 
ab 

Per completare Martijn Pieters risposta, se si utilizza stringhe tra virgolette triple si deve rimuovere il \, utilizzando sia non si ottiene a capo:

In [6]: """a\ 
b""" 
Out[6]: 'ab' 
Problemi correlati