2012-05-28 32 views
7

tôi đang cố gắng thu thập thông tin từ một cơ sở dữ liệu SQL sử dụng pythonLàm thế nào để xử lý một tuyên bố chuỗi SQL dài bằng Python

tôi đã có thể kết nối và lấy dữ liệu khi câu lệnh SQL là đơn giản như

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

Tuy nhiên khi tôi chuyển sang một tuyên bố phức tạp hơn tôi nhận được lỗi hiển thị dưới đây

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

tuyên bố này hoạt động khi tôi sử dụng Microsoft SQL 2008 khách hàng nhưng không phải trong python.

Tôi đang làm gì không chính xác? Đối với các câu lệnh phức tạp, tôi có nên sử dụng SQLAlchemy không?

http://www.sqlalchemy.org/

Mã hiện tại Dưới đây

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

Xem ở trên ..... –

Trả lời

11

Chuỗi python của bạn đang được nối với nhau mà không có dòng mới, do đó không có dấu cách trước từ khóa where. Tốt hơn sử dụng chuỗi ba trích dẫn khi làm việc với xâu đa dòng:

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

chuỗi Triple-trích dẫn duy trì dòng mới:

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

Nếu đây là một-of bạn không nhất thiết cần phải sử dụng SQLAlchemy, nhưng khi dự án của bạn phát triển bạn sẽ thấy rằng thư viện đó cung cấp nhiều thuận lợi, bao gồm việc tạo logic điều kiện dễ dàng hơn nhiều (thêm mệnh đề WHERE dựa trên if/then branch, v.v.).

+1

+1 cho chuỗi được trích dẫn gấp ba lần. – dusan

3

Đặt một không gian trước khi từ khóa where. Python không thêm không gian khi sử dụng \:

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

Để bổ sung cho Martijn Pieters câu trả lời, nếu bạn sử dụng chuỗi trích dẫn ba bạn phải gỡ bỏ các \, sử dụng cả hai bạn không nhận được dòng mới:

In [6]: """a\ 
b""" 
Out[6]: 'ab' 
Các vấn đề liên quan