2012-05-28 10 views
7

Estoy tratando de obtener información de una base de datos SQL mediante pitónCómo manejar una cadena larga declaración SQL en Python

pude conectar y recuperar datos cuando la instrucción SQL era simple, como

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

sin embargo cuando me traslado a una declaración más compleja consigo el error se muestra a continuación

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'. 

Esta declaración funciona cuando se utiliza Microsoft SQL 2008 Cliente pero no en pitón.

¿Qué estoy haciendo incorrecto? Para declaraciones complejas, ¿debería usar SQLAlchemy?

http://www.sqlalchemy.org/

código actual A continuación

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

Véase más arriba ..... –

Respuesta

11

Su cadena de pitón se está uniendo sin líneas nuevas, por lo que no hay espacio antes de la palabra clave where. Mejor utilizar cadenas triple citado cuando se trabaja con los literales de cadena multilínea:

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""") 

cadenas de triples citado mantener saltos de línea:

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

Si esto es un uno-de que no necesariamente tienen que utilizar SQLAlchemy, pero a medida que su proyecto crezca, encontrará que esa biblioteca ofrece muchas ventajas, incluida la simplificación de la lógica condicional (agregando más cláusulas WHERE basadas en ramas if/then, etc.).

+1

+1 para cadenas de comillas triples. – dusan

3

Ponga un espacio antes de la palabra clave where. Python no añadir espacios al utilizar \:

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

Para complementar la respuesta Martijn Pieters, si utiliza cadenas entre comillas triples que tienen que quitar el \, utilizando tanto no obtiene nuevas líneas:

In [6]: """a\ 
b""" 
Out[6]: 'ab' 
Cuestiones relacionadas