Python 3.4 - pyodbc 字符集/格式问题

0 投票
1 回答
690 浏览
提问于 2025-04-18 13:06

我在下面的代码上遇到了一些问题。这个代码主要是做一个“显示表格”的操作,替换一个字符串,然后执行输出的字符串。

表格的定义如下:

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  );

执行 print(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 个回答

1

当你执行

our_str = str(objectlist[0])

时,你实际上是把整行数据转换成了一个字符串(即使这一行可能只有一列),所以输出的字符串看起来是

('line1\rline2',)

如果你从这一行中提取出第一列,那么你应该得到一个没有任何修饰的字符串

our_str = objectlist[0][0]

打印出来应该是这样的

line1
line2

另外,你也可以用fetchone()来代替fetchall(),因为看起来你只想获取一行数据。在这种情况下

our_str = objectlist[0]

就足够了。

撰写回答