我正在尝试生成&通过pyodbc执行SQL语句。我期望有多个SQL语句,所有这些语句都以相同的SELECT&FROM,但在WHERE中具有不同的值。我的WHERE子句中的值是通过循环表派生的——SQL脚本在表中找到的每个不同的值,我需要Python用这个值生成另一个SQL语句作为WHERE子句。
我几乎做到了,我只是在努力让pyodbc将我的查询字符串放在SQL喜欢的格式中。到目前为止我的代码:
import pyodbc
cn = pyodbc.connect(connection info)
cursor = cn.cursor()
result = cursor.execute('SELECT distinct searchterm_name FROM table1')
for row in result:
sql = str("SELECT * from table2 WHERE table1.searchterm_name = {c}".format(c=row)),
#print sql
这段代码生成这样的输出,其中"name here"基于表1中的值。
('SELECT * from ifb_person WHERE searchterm_name = (u'name here', )',)
我只需要删除所有围绕查询的垃圾&where子句,所以它看起来像这样。然后我可以将它传递到另一个游标中。execute()
从ifb_person WHERE searchterm_name="name here"中选择*
编辑
for row in result:
cursor.execute("insert into test (searchterm_name) SELECT searchterm_name FROM ifb_person WHERE searchterm_name = ?",
(row[0],))
此查询失败,出现错误pyodbc.ProgrammingError: No results. Previous SQL was not a query.
基本上,我要做的是让Python为它在表1中找到的每个结果生成一个新的SQL语句。第二个查询是针对表ifb_person运行搜索,并将结果插入到表"test"中。我想为表1 中的每个结果运行单独的SQL语句
pyodbc允许我们迭代Cursor对象以返回行,在此期间Cursor物体仍在"使用中",因此我们不能使用相同的Cursor物件来执行其他操作。例如,此代码将失败:
crsr = cnxn.cursor()
result = crsr.execute("SELECT ...") # result is just a reference to the crsr object
for row in result:
# we are actually iterating over the crsr object
crsr.execute("INSERT ...") # this clobbers the previous crsr object ...
# ... so the next iteration of the for loop fails with " Previous SQL was not a query."
我们可以通过使用fetchall()
将所有行检索到result
中来解决这个问题。。。
result = crsr.execute("SELECT ...").fetchall()
# result is now a list of pyodbc.Row objects and the crsr object is no longer "in use"
或者在循环中使用不同的Cursor对象
crsr_select = cnxn.cursor()
crsr_insert = cnxn.cursor()
crsr_select.execute("SELECT ...")
for row in crsr_select:
crsr_insert.execute("INSERT ...")