2014-07-13 142 views
0

遇到以下代碼的問題。它基本上是做一個「show table」,替換一個字符串並執行輸出字符串。Python 3.4 - pyodbc字符集/格式問題

表定義

from macpath import join 
import pyodbc 
from builtins import print 
import logging 
import re 
import codecs 

#pyodbc connection 
cnxn = pyodbc.connect('Driver=Teradata;DBCName=192.168.1.103;DATABASE=testdb;UID=xxx;PWD=xxx') 

#create cursor 
cursor = cnxn.cursor() 

try: 
    cursor.execute(""" 
    show table ENVIRON1.DEPT 
    """) 
except pyodbc.Error as err: 
    logging.warning(err) 

objectlist = cursor.fetchall() 
for row in objectlist: 
      our_str = str(objectlist[0]) 
      our_str = re.sub("ENVIRON1", "ENVIRON2", our_str, flags=re.I) 
      print(our_str) 
      try: 
       cursor.execute(our_str) 
      except pyodbc.Error as err: 
       logging.warning(err) 
      except pyodbc.ProgrammingError as err: 
       logging.warning(err) 

表定義如下:

CREATE SET TABLE ENVIRON1.DEPT ,NO FALLBACK , 
    NO BEFORE JOURNAL, 
    NO AFTER JOURNAL, 
    CHECKSUM = DEFAULT 
    (
     Key_Id SMALLINT NOT NULL 
) 
UNIQUE PRIMARY INDEX (Key_Id ); 

打印(ourstr) 的輸出是

('CREATE SET TABLE ENVIRON2.DEPT ,NO FALLBACK ,\r  NO BEFORE JOURNAL,\r  NO AFTER JOURNAL,\r  CHECKSUM = DEFAULT,\r  DEFAULT MERGEBLOCKRATIO\r  (\r  Key_Id SMALLINT NOT NULL)\rUNIQUE PRIMARY INDEX (Key_Id);',) 

輸出
cursor.execute(our_str) 

WARNING:root:('42000', "[42000] [Teradata][ODBC Teradata Driver][Teradata Database] Syntax error, expected something like a 'SELECT' keyword or '(' or a 'NONTEMPORAL' keyword or 'AS' keyword between '(' and the string 'CREATE SET TABLE ENVIRON2.DEPT ,NO FALLBACK ,\\r  NO BEFORE JOURNAL,\\r  NO AFTER JOURNAL,\\r  CHECKSUM = DEFAULT. (-3707) (SQLExecDirectW)") 

問題是回車\ r。 cursor.execute(our_str)語句將回車作爲文字「\ r」導致語法錯誤

有關如何解決此問題的任何提示?

回答

1

當你

our_str = str(objectlist[0]) 

要轉換一個完整的「行」的字符串(即使該行可能只包含一列),因此字符串出來作爲

('line1\rline2',) 

如果你從行中提取第一列,那麼你應該只是得到undecorated字符串

our_str = objectlist[0][0] 

其在打印時看起來應該像

line1 
line2 

或者,而不是fetchall()你可以只是做fetchone()因爲它看起來像你只想到反正檢索一行。在這種情況下,

our_str = objectlist[0] 

應該就足夠了。

+0

謝謝戈登。完美工作:-) – tonez