我正在运行以下代码:SQL脚本的第一部分创建一个表,并以';'结尾。然后sql的第二部分创建另一个表。运行python脚本时,似乎创建了表,但随后循环遍历,并出现错误:
pyodbc.Error:((('HY000','[HY000]虚拟表'MY_FIRST_TABLE_NAME' 已经存在。 (1000)(SQLExecDirectW)')
我的代码:
import pyodbc
import getpass
import os
print ("Connecting via ODBC")
windows_password=getpass.getpass('Enter your windows password please')
composite_connection=pyodbc.connect("Driver=my driver;HOST=my host;PORT=my port;UID={0};PWD={1};DOMAIN=my domain;DATASOURCE=my datasource".format(getpass.getuser(),windows_password),autocommit=True)
print ("You are Connected\n")
inputdir = 'C:\\Users\\abc01'
for script in os.listdir(inputdir):
with open(inputdir+'\\' + 'my_sql_script.sql','r') as inserts:
sqlScript = inserts.read()
for statement in sqlScript.split(';'):
with composite_connection.cursor() as cur:
cur.execute(statement)
print(script)
composite_connection.close()
>
这是sql:
CREATE TABLE DB.Table_1
(
ORDER_INFO_ID VARCHAR(30),
ACCOUNT_NUMBER VARCHAR(30),
ORDER_ID VARCHAR(20),
MOBILE_NUMBER VARCHAR(20),
ADD_FIRST_LINE VARCHAR(150),
POSTCODE_LAST VARCHAR(5)
)
;
CREATE TABLE DB.Table_2
(ACCOUNT_NUMBER VARCHAR (30),
MOBILE_NUMBER VARCHAR (30)
)
答案 0 :(得分:1)
虚拟表会在整个会话中持续存在。
您的循环将在同一会话中执行所有查询,如果第一个查询创建了一个虚拟表,那么当第二个查询尝试创建相同的虚拟表时,您将得到错误。
如果希望它们在不同的会话中运行,请移动连接并使其靠近最内层的循环