【问题标题】:Volatile table can not be create in python importing pyodbc在 python 导入 pyodbc 中无法创建易失性表
【发布时间】:2014-04-19 17:34:43
【问题描述】:

代码如下,顺便说一下,我使用的数据库是teradata,在windows 7操作系统和python 2.7版中。

import pyodbc
cnxn = pyodbc.connect('DSN=thisIsAbsolutelyCorrect;UID=cannottellyou;PWD=iamsosorry')
cursor1 = cnxn.cursor()
cursor1=cursor1.execute(
##################        OR put your SQL dirctly between here        ################
'''

create volatile table table1
(
field1  integer
,field2 integer
)on commit preserve rows;
--insert into table1
--values(12,13);
--select   * from table1;






''')  
#########################        and here         ########################
cnxn.commit()
for row in cursor1:
    print row
raw_input()

但我得到这样的错误:

Traceback (most recent call last):
  File "C:\Users\issuser\Desktop\py\test.py", line 25, in <module>
    for row in cursor1:
ProgrammingError: No results.  Previous SQL was not a query.

我该如何解决这个错误?

【问题讨论】:

  • 您要打印什么?插入和选择语句被注释掉。

标签: python sql teradata pyodbc


【解决方案1】:

游标对象将没有要遍历的行。我认为您想要的是迭代执行的结果。

rows = curs.execute(""" sql code """).fetchall()
for row in rows:
    print row

这是一个使用 pyodbc 从 python2.7 上传到 teradata 中的 volatile 表的模板:


import pyodbc
cnxn = pyodbc.connect('your_connection_string')
curs = cnxn.cursor()
curs.execute("""
    CREATE VOLATILE TABLE TABLE_NAME
        (
        c_0 dec(10,0),
        ...
        c_n dec(10,0)
        ) PRIMARY INDEX (c0)
        ON COMMIT PRESERVE ROWS;
        END TRANSACTION;
        """)

curs.execute("""
    INSERT INTO TABLE_NAME (c_0,...,c_n) VALUES (%s);
    """%value_string)

根据您在 Teradata 中的设置,您必须明确 END TRANSACTION。 您可以在 INSERT 周围添加循环以逐行上传信息。

【讨论】:

  • 你说的太对了!实际上我误解的是 1. curs.execute() 和 2. something=curs.execute() 之间的区别;当你创建一个 volatile 表时,它实际上没有返回。所以不需要给变量,以便打印出来。我们可以做很多 1. 在需要 2. 之前。
【解决方案2】:

您是否考虑过以下几点:

import pyodbc
cnxn = pyodbc.connect('DSN=thisIsAbsolutelyCorrect;UID=cannottellyou;PWD=iamsosorry')
cursor1 = cnxn.cursor()
RowCount=cursor1.execute(
'''
create volatile table table1
(
field1  integer
,field2 integer
)on commit preserve rows;
''').rowcount   

RowCount=cursor1.execute('''insert into table1 values(12,13);''').rowcount

cnxn.commit()

for row in cursor1:
    print row
raw_input()

我认为问题在于您编写的EXECUTE() 方法期望返回一个游标。 DDL 和 DML 语句(如 INSERTUPDATEDELETE)不返回结果集。将ROWCOUNT 变量与EXECUTE() 方法一起使用来处理易失性表的创建及其填充可能会更成功。

您可能还必须在创建 volatile 表和填充表之间发出提交。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-08-04
    • 1970-01-01
    相关资源
    最近更新 更多