【发布时间】:2020-03-19 20:40:00
【问题描述】:
作为一个 SQL 新手,我试图确保最初将数据导入数据库时不会创建重复条目,并且将以编程方式创建数据库。如果有更有效的方法来执行此操作(请告诉我!),我不会感到惊讶,但我的方法是删除数据库并在它已经存在的情况下重新创建它,据我所知,这非常快。我已经在函数之外成功地使用了相同的语句并且没有格式化字符串,但是在创建一个函数来执行它时,我通过 PYODBC 收到错误:
ProgrammingError: ('42S22', "[42S22] [Microsoft][ODBC Driver 17 for SQL Server][SQL Server]Invalid column name 'test'. (207) (SQLExecDirectW)")
这很令人困惑,因为我不想引用任何列,更不用说表了;所以这使得故障排除变得困难。功能如下:
def db_connect(db, driver='ODBC Driver 17 for SQL Server', host='', UID='', PWD='', autocommit=False):
"""Returns a connection and a cursor object for the specified database."""
conn = pyodbc.connect(driver=driver,
host=host,
database=db,
UID=UID,
PWD=PWD,
autocommit=autocommit
)
print(f'Connect established to database {db}')
return conn, conn.cursor()
def db_clear(db, recreate=True):
"""Drops and recreates the specified database, ready for insert."""
conn, curs = db_connect('master')
curs.execute(f"""IF EXISTS (SELECT name from sys.databases WHERE (name = {db}))
BEGIN
ALTER DATABASE {db} SET SINGLE_USER WITH ROLLBACK IMMEDIATE;
DROP DATABASE {db};
END;""")
if recreate:
curs.execute(f"CREATE DATABASE {db};")
conn.close()
print(f'{db} successfully dropped and recreated.')
else:
print(f'{db} successfully dropped.')
return
db_clear('test')
在包含END;""") 的行上引发异常。工作版本(不包含在函数中)和这个函数版本之间只有两个区别,因为我开始使用更新的驱动程序来更好地处理数据类型转换,并且在这些函数完成后我关闭了自动提交以批量插入他们的工作。我尝试将这两个选项都恢复为函数中的原始设置,但收到了相同的错误。任何帮助表示赞赏!
【问题讨论】: