18

Pythonを使用してSQLデータベースから情報を取得しようとしています

SQLステートメントが次のように単純な場合、データを接続して取得することができました

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

ただし、より複雑なステートメントに移動すると、以下に示すエラーが発生します

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

このステートメントは、Microsoft SQL 2008クライアントを使用しているが、Pythonでは使用していない場合に機能します。

私は何を間違っていますか?複雑なステートメントの場合、SQLAlchemyを使用する必要がありますか?

http://www.sqlalchemy.org/

以下の現在のコード

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

2 に答える 2

31

Python文字列は改行なしで結合されているため、whereキーワードの前にスペースはありません。複数行の文字列リテラルを操作する場合は、トリプルクォートされた文字列を使用することをお勧めします。

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

トリプルクォートされた文字列は改行を維持します。

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

これが1つである場合、必ずしもSQLAlchemyを使用する必要はありませんが、プロジェクトが大きくなるにつれて、そのライブラリには、条件付きロジックの作成がはるかに簡単になる(if / thenブランチに基づいてWHERE句を追加するなど)多くの利点があることがわかります。等)。

于 2012-05-28T15:46:02.170 に答える
6

whereキーワードの前にスペースを入れてください。\を使用する場合、Pythonはスペースを追加しません:

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

Martijn Pietersの回答を補足するために、三重引用符で囲まれた文字列を使用する場合は、を削除する必要が\あります。両方を使用すると、改行は取得されません。

In [6]: """a\
b"""
Out[6]: 'ab'
于 2012-05-28T15:44:38.877 に答える