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 上运行