2012-12-11 26 views
5

मुझे किसी MSSQL सर्वर से पायथन में मान्य स्ट्रिंग नहीं मिल सकती है। मेरा मानना ​​है कि कहीं एक एन्कोडिंग मेल नहीं है। मेरा मानना ​​है कि यह ओडीबीसी परत और पायथन के बीच है क्योंकि मैं tsql और isql में पठनीय परिणाम प्राप्त करने में सक्षम हूं।मैं फ्रीटीडीएस और यूनिक्सोडबीसी का उपयोग कर SQL सर्वर से तारों को सही तरीके से स्वीकार करने के लिए pyodbc को कैसे कॉन्फ़िगर कर सकता हूं?

पाइडबैक की क्या विशेषता एन्कोडिंग अपेक्षित है? इसे काम करने के लिए मुझे चेन में बदलने की क्या ज़रूरत है?

#!/usr/bin/env python 
import pyodbc 

dsn = 'yourdb' 
user = 'import' 
password = 'get0lddata' 
database = 'YourDb' 

def get_cursor(): 
    con_string = 'DSN=%s;UID=%s;PWD=%s;DATABASE=%s;' % (dsn, user, password, database) 
    conn = pyodbc.connect(con_string) 
    return conn.cursor() 

if __name__ == '__main__': 
    c = get_cursor() 
    c.execute("select id, name from recipe where id = 4140567") 

    row = c.fetchone() 
    if row: 
     print row 

इस स्क्रिप्ट का आउटपुट है:

विशिष्ट उदाहरण

यहाँ एक उदाहरण के रूप में एक सरल अजगर स्क्रिप्ट है

(Decimal('4140567'), u'\U0072006f\U006e0061\U00650067') 

वैकल्पिक रूप से, अगर की अंतिम पंक्ति लिपि में बदल दिया गया है:

print "{0}, '{1}'".format(row.id, row.name) 

तो परिणाम है:

Traceback (most recent call last): 
    File "/home/mdenson/projects/test.py", line 20, in <module> 
    print "{0}, '{1}'".format(row.id, row.name) 
UnicodeEncodeError: 'ascii' codec can't encode characters in position 0-2: ordinal not in range(128) 

एक प्रतिलिपि TSQL का उपयोग कर एक ही क्वेरी निष्पादित करने के लिए:

[email protected]:~# tsql -S cmw -U import -P get0lddata 
locale is "C" 
locale charset is "ANSI_X3.4-1968" 
using default charset "UTF-8" 
1> select id, name from recipe where id = 4140567 
2> go 
id  name 
4140567 orange2 
(1 row affected) 

और भी में isql:

[email protected]:~# isql -v yourdb import get0lddata 
SQL> select id, name from recipe where id = 4140567 
+----------------------+--------------------------+ 
| id     | name      | 
+----------------------+--------------------------+ 
| 4140567    | orange2     | 
+----------------------+--------------------------+ 
SQLRowCount returns 1 
1 rows fetched 

तो मैंने सुबह सुबह इस पर काम किया है और उच्च और निम्न देखा और यह पता नहीं लगाया कि क्या अस्वस्थ है।

विवरण

यहाँ संस्करण विवरण हैं:

  • ग्राहक Ubuntu 12.04
  • freetds v0.91
  • unixodbc 2.2.14
  • अजगर है 2.7.3
  • पायोडबैक 2.1.7-1 (उबंटू पैकेज से) & 3.0.7-beta06 (स्रोत से संकलित)

  • सर्वर SQL सर्वर एक्सप्रेस 2008 R2

साथ XP है यहाँ ग्राहक पर कुछ विन्यास फाइल की सामग्री को कर रहे हैं।

/etc/freetds/freetds.conf
[global] 
    tds version = 8.0 
    text size = 64512 
[cmw] 
    host = 192.168.90.104 
    port = 1433 
    tds version = 8.0 
    client charset = UTF-8 

/etc/odbcinst.ini

[FreeTDS] 
Description = TDS driver (Sybase/MS SQL) 
Driver = /usr/lib/x86_64-linux-gnu/odbc/libtdsodbc.so 
Setup = /usr/lib/x86_64-linux-gnu/odbc/libtdsS.so 
CPTimeout = 
CPReuse = 
FileUsage = 1 

/etc/ODBC।ini

[yourdb] 
Driver = FreeTDS 
Description = ODBC connection via FreeTDS 
Trace = No 
Servername = cmw 
Database = YourDB 
Charset = UTF-8 
+0

इस पर मेरे निरंतर काम में मैंने अब pyodbc का नवीनतम संस्करण संकलित किया है, 3.0.7-beta06, _but_ व्यवहार में कोई बदलाव नहीं है। – MatthewD

उत्तर

2

तो निरंतर काम के बाद अब मुझे यूनिकोड वर्ण पाइथन में मिल रहा है। दुर्भाग्यवश जिस समाधान पर मैंने ठोकर खाई है वह आपके चचेरे भाई को चुंबन के रूप में संतोषजनक है।

मैंने python3 और python3-dev संकुल को संस्थापित करके समस्या को हल किया और फिर python3 के साथ pyodbc को पुनर्निर्माण किया।

अब मैंने यह किया है मेरी स्क्रिप्ट अब काम करती है भले ही मैं उन्हें अभी भी अजगर 2.7 के साथ चला रहा हूं।

इसलिए मुझे नहीं पता कि यह करने से क्या तय किया गया था, लेकिन अब यह काम करता है और मैं जिस परियोजना के साथ शुरू हुआ था, उस पर जा सकता हूं।

+1

यह पाइथन संस्करण नहीं है, यह उबंटू का पैकेज है। डेबियन एक ही समस्या थी। मैंने डेबियन के पैकेज को हटा दिया और पाइपबैक को 'पीआईपी' के माध्यम से स्थापित किया और सब ठीक काम करता है, कोई पायथन 3 आवश्यक नहीं है। –

1

कोई भी मौका आपको बीओएम (बाइट ऑर्डर मार्कर) में कोई समस्या हो रही है? यदि हां, तो शायद इस कोड स्निपेट को मदद मिलेगी:

import codecs 
if s.beginswith(codecs.BOM_UTF8): 
    # The byte string s begins with the BOM: Do something. 
    # For example, decode the string as UTF-8 

if u[0] == unicode(codecs.BOM_UTF8, "utf8"): 
    # The unicode string begins with the BOM: Do something. 
    # For example, remove the character. 

# Strip the BOM from the beginning of the Unicode string, if it exists 
u.lstrip(unicode(codecs.BOM_UTF8, "utf8")) 

मैं this page पर कि स्निपेट नहीं मिला।

+0

हम्म। मैंने आपका उत्तर और लिंक पढ़ लिया है और मुझे यकीन नहीं है कि यह समस्या है या कम से कम मुझे नहीं पता कि इसके साथ कुछ कैसे करना है। यह स्ट्रिंग यू '\ U0072006f \ U006e0061 \ U00650067' से दिखाई देता है कि प्रत्येक जोड़ी अक्षरों को बदल दिया जाता है लेकिन इसमें गायब 7 वें चरित्र और बीओएम का कोई संकेत नहीं है जिसे मैं देख सकता हूं। – MatthewD

+0

मैं वास्तव में त्रुटि पर आधारित समस्या पर एक स्टैब ले रहा था कि यह कह सकता है कि "... 0-2 में पदों को एन्कोड नहीं कर सकता क्योंकि वे सीमा में नहीं हैं"। क्षमा करें मैथ्यू। –

0

यदि आप pyodbc को संस्करण 3 में अपग्रेड करते हैं तो समस्या हल हो जाएगी।