سؤال

لديّ قطعة من الكود تعمل مثل السحر إذا قمت بتشغيل البرنامج على جهاز Mac (ماجستير إدارة الأعمال في مافريكس). إذا قمت بنقل الرمز إلى مربع Windows (Windows Server 2008 R2 64 Bit) ، أحصل على خطأ في استعلام 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

لم يعمل هذا الرمز على جهاز Mac حتى أضفت "، في نهاية جملة" WHERE ". هذا هو المكان الذي يبدو أن مكتبة 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"

بحسب ال إصدار طريقة المكتبات في كلا المكانين على نفس الإصدار. على النحو التالي:

على ماك:

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'
>>>
هل كانت مفيدة؟

المحلول

هل قمت بفحص الرسائل الموجودة على خادم SQL؟ (هل اتصال قاعدة البيانات بخير على كلا الجهازين؟)

أيضا ، هل حاولت تقييم السلسلة قبل الاتصال بالتنفيذ؟ شيء مثل:

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)

نصائح أخرى

بفضل آدم والتشاور مع و SQL Guru هنا ، تمكنا من إثبات أن تقييم ٪ s يبدو أنه يعمل بشكل مختلف على Mac و PC.

لذلك ، قمت بإعادة هيكلة الرمز على النحو التالي (على غرار ما اقترحه آدم - لكن مختلف قليلاً):

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!

مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top