【问题标题】:How to handle a long SQL statement string in Python如何在 Python 中处理长 SQL 语句字符串
【发布时间】:2012-05-28 15:39:01
【问题描述】:

我正在尝试使用 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)

【问题讨论】:

  • 您应该回答自己的问题作为答案 - 不要更新问题,使其不再作为问题有意义。您在下面接受的答案是正确的,但问题应保持原始状态,以说明查询为何不起作用。

标签: python sql


【解决方案1】:

您的 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"

如果这是一个你不一定需要使用 SQLAlchemy,但随着你的项目的增长,你会发现该库提供了许多优点,包括使条件逻辑更容易(添加更多基于 if/ 的 WHERE 子句然后是分支等)。

【讨论】:

    【解决方案2】:

    where 关键字之前放置一个空格。 Python 使用 \:

    时不添加空格
    In [5]: print "a\
       ...: b"
    ab
    

    为了补充 Martijn Pieters 的答案,如果您使用三重引号字符串,则必须删除 \,同时使用这两个字符串您不会得到换行符:

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2016-12-30
      • 2018-10-11
      • 1970-01-01
      • 1970-01-01
      • 2016-11-24
      • 2021-12-27
      • 1970-01-01
      相关资源
      最近更新 更多