【问题标题】:Python 3.4 - pyodbc character set / formatting issuePython 3.4 - pyodbc 字符集/格式问题
【发布时间】:2014-07-13 01:05: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  );

的输出 打印(我们的) 是

('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”导致语法错误

关于如何解决这个问题的任何提示?

【问题讨论】:

    标签: python python-3.x pyodbc


    【解决方案1】:

    当你这样做时

    our_str = str(objectlist[0])
    

    您正在将整个“行”转换为字符串(即使该行可能只包含一列),所以字符串输出为

    ('line1\rline2',)
    

    如果你从行中提取第一列,那么你应该只得到未修饰的字符串

    our_str = objectlist[0][0]
    

    打印出来的样子

    line1
    line2
    

    或者,您可以直接使用fetchone() 而不是fetchall(),因为看起来您只希望检索一行。那样的话

    our_str = objectlist[0]
    

    应该够了。

    【讨论】:

    • 感谢上帝。完美工作:-)
    猜你喜欢
    • 1970-01-01
    • 2014-06-11
    • 1970-01-01
    • 1970-01-01
    • 2017-07-13
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多