无法在Python中使用pyodbc创建临时表

0 投票
2 回答
2158 浏览
提问于 2025-04-17 22:18

下面是代码,顺便说一下,我使用的数据库是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.

我该如何解决这个错误呢?

2 个回答

0

你有没有考虑过以下几点:

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() 方法期待返回一个游标(cursor)。但是像 INSERTUPDATEDELETE 这样的操作并不会返回结果集。你可以尝试使用 ROWCOUNT 变量配合 EXECUTE() 方法,这样在创建临时表和填充数据时可能会更有效。

另外,你可能还需要在创建临时表和填充数据之间执行一个提交(commit)操作。

1

一个游标对象将没有行可以遍历。我想你想要的是遍历执行结果。

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

这里有一个模板,可以用来从Python 2.7通过pyodbc上传数据到Teradata的临时表:


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中的设置,你必须明确地结束事务。你可以在插入操作周围加一个循环,以逐行上传信息。

撰写回答