Pymssql 程序可以在 mac 上运行,但不能在 windows 上运行

Posted

技术标签:

【中文标题】Pymssql 程序可以在 mac 上运行,但不能在 windows 上运行【英文标题】:Pymssql program works on mac but but not on windows 【发布时间】:2013-11-07 02:35:35 【问题描述】:

如果我在 Mac 上运行程序(MBA 运行小牛队),我有一段代码就像一个魅力。如果我将代码移动到 windows 框(windows server 2008 R2 64 位),我会在 SQL 查询本身上收到错误(如下所示)。该错误表示“,”附近有语法错误。

我正在运行的代码如下:

    try:
      cur.execute("SELECT * FROM dbo.IPAM_Node as A \
        FULL OUTER JOIN IPAM_NodeAttrData as B ON A.IPNodeId = B.IPNodeId \
        FULL OUTER JOIN IPAM_Group as C on A.SubnetId = C.GroupId \
        FULL OUTER JOIN IPAM_GroupAttrData as D on C.GroupId = D.GroupId \
        WHERE IPAddress IN (%s);",(Hosts_as_Tuples,))
      allrows = cur.fetchall()
      print 'allrows:', allrows

在我在“WHERE”子句末尾添加“,”之前,此代码在 MAC 上不起作用。这是 windows 库似乎反对的地方。我试过把“,”去掉,程序运行正常,但它没有正确评估元组。

我尝试了各种建议,例如使用“”” - 无济于事或行为改变。

运行时错误如下所示:

C:\SFTP_Root\v1.0.1.d\Model>[07/Nov/2013:12:25:27] ENGINE Listening for SIGTERM.

[07/Nov/2013:12:25:27] ENGINE Bus STARTING
[07/Nov/2013:12:25:27] ENGINE Set handler for console events.
CherryPy Checker:
The Application mounted at '' has an empty config.

[07/Nov/2013:12:25:27] ENGINE Started monitor thread 'Autoreloader'.
[07/Nov/2013:12:25:27] ENGINE Started monitor thread '_TimeoutMonitor'.
[07/Nov/2013:12:25:27] ENGINE Serving on 10.188.49.151:4444
[07/Nov/2013:12:25:27] ENGINE Bus STARTED
it is NOT a list
Host List: ['10.188.49.0', '10.188.49.1', '10.188.49.2', '10.188.49.3']
**DATABASE ERROR: (102, "Incorrect syntax near ','.DB-Lib error message 102, sever
ity 15:\nGeneral SQL Server error: Check messages from the SQL Server\n")**
144.131.52.107 - - [07/Nov/2013:12:25:38] "GET /ip/informationservice/?ipaddress
=10.188.49.0/30 HTTP/1.1" 200 346 "" "Mozilla/5.0 (Macintosh; Intel Mac OS X 10.
9; rv:25.0) Gecko/20100101 Firefox/25.0"

根据 version 方法,两个地方的库都在同一版本上。如下:

在 Mac 上:

isp-pc:site-packages matingara$ python
Python 2.7.5 (v2.7.5:ab05e7dd2788, May 13 2013, 13:18:45)
[GCC 4.2.1 (Apple Inc. build 5666) (dot 3)] on darwin
Type "help", "copyright", "credits" or "license" for more information.
>>> import pymssql
>>> pymssql.__version__
'2.0.0'
>>>

在 Windows 上(尝试了两个版本的 python):

C:\Python27>python.exe
Python 2.7.3 (default, Apr 10 2012, 23:31:26) [MSC v.1500 32 bit (Intel)] on win
32
Type "help", "copyright", "credits" or "license" for more information.
>>> import pymssql
>>> pymssql.__version__
'2.0.0'
>>>

C:\Python27>python.exe
Python 2.7.5 (default, May 15 2013, 22:44:16) [MSC v.1500 64 bit (AMD64)] on win
32
Type "help", "copyright", "credits" or "license" for more information.
>>> import pymssql
>>> pymssql.__version__
'2.0.1'
>>>

【问题讨论】:

是的 - 我知道。我无法让页面接受我的代码 - 它说“缩进四个空格” - 所以我按字面意思理解。 'try' 块在脚本本身中就很好! 正如我所说,代码在 mac 上运行良好,只在 windows 上抛出错误。 【参考方案1】:

你检查过 sql server 上的消息吗? (两台机器上的数据库连接正常吗?)

另外,您是否尝试在调用执行之前评估字符串?比如:

queryString = "SELECT * FROM dbo.IPAM_Node as A \
    FULL OUTER JOIN IPAM_NodeAttrData as B ON A.IPNodeId = B.IPNodeId \
    FULL OUTER JOIN IPAM_Group as C on A.SubnetId = C.GroupId \
    FULL OUTER JOIN IPAM_GroupAttrData as D on C.GroupId = D.GroupId \
    WHERE IPAddress IN (%s);" % (Hosts_as_Tuples,)

print queryString

cur.execute(queryString)

【讨论】:

感谢亚当的回复!我已经尝试过 queryString 的想法,它并没有改变行为。不过,我会再试一次。我还尝试了多行没有“\”连续字符并用三引号“””括起来的 queryString。 另外,我知道数据库连接工作正常,因为同一代码中的其他方法工作正常。此外,如果我在 (Hosts_as_Tuples) 之后删除尾随的“,”,则查询有效,但 cur.fetchall() 只会返回一行! 我也会在 sql server 上看看有什么消息。 sql server 消息可能是您查明问题原因的最佳选择。 最后。使用查询字符串的想法并使其正确确实在疯狂的开发和 Windows 操作环境中解决了这个问题!【参考方案2】:

感谢 Adam 并在这里咨询了 SQL 专家,我们成功地证明了 %s 的评估似乎在 mac 和 pc 上的工作方式不同。

所以,我将代码重组如下(类似于 Adam 的建议 - 但略有不同):

try:
  sqlQuery = "SELECT * FROM dbo.IPAM_Node as A \
    FULL OUTER JOIN IPAM_NodeAttrData as B ON A.IPNodeId = B.IPNodeId \
    FULL OUTER JOIN IPAM_Group as C on A.SubnetId = C.GroupId \
    FULL OUTER JOIN IPAM_GroupAttrData as D on C.GroupId = D.GroupId \
    WHERE IPAddress IN " + str(Hosts_as_Tuples) + ";" 
  cur.execute(sqlQuery)

换句话说,我通过连接几个字符串来构建查询。现在可以在 Windows 上使用!

【讨论】:

以上是关于Pymssql 程序可以在 mac 上运行,但不能在 windows 上运行的主要内容,如果未能解决你的问题,请参考以下文章

pymssql 在 Azure/Windows 上返回的字符集与在 Mac 上不同

tsql 实用程序 (FreeTDS) 可以连接到 SQL Server,但 pymssql 不能

模拟器中的 iPhone 应用程序可在一台 Mac 上运行,但不能在另一台 Mac 上运行

无法在 Mac 上使用 pip 安装 pymssql 并链接到使用 fink 安装的 FreeTDS

麻烦在 MacOS Mojave 上安装 pymssql

pymssql:Mac OS 中的软件包安装失败