代码如下,顺便说一下我使用的数据库是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.
如何解决此错误?
答案 0 :(得分: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 :(得分: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()
方法期望返回游标。 DDL和DML语句(如INSERT
,UPDATE
,DELETE
不返回结果集。使用ROWCOUNT
变量和EXECUTE()
方法处理易失性表创建及其填充可能会更成功。
您可能还必须在创建易失性表和填充表之间发出提交。