Python 和 SQL 通过 pyodbC语言 通过带有动态 where 子句的循环执行查询



我正在尝试生成&通过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 ...")

相关内容

  • 没有找到相关文章

最新更新