使用Python pyodbc写入Azure SQL Database时遇ProgrammingError错误求助
问题:迁移至Azure SQL Database时出现pyodbc ProgrammingError错误
之前使用Python pyodbc向SQL Server Express写入数据,因Express达到10GB磁盘上限,切换至Microsoft Azure SQL Database时遇到以下错误:
ProgrammingError: (pyodbc.ProgrammingError) ('42000', "[42000] [Microsoft][ODBC SQL Server Driver][SQL Server]Reference to database and/or server name in 'master.dbo.syscharsets' is not supported in this version of SQL Server.
使用的代码如下:
conn = pyodbc.connect('DRIVER={SQL Server};SERVER=192.111.111;DATABASE=MYDB;UID=' + keyring.get_password("local", "UID") + ';PWD=' + keyring.get_password("local", "PWD") + ';') cursor = conn.cursor() for index, row in df_add.iterrows(): cursor.execute("INSERT INTO mytable([ID],[CreateDate]) values(?,?)",row['ID'], row['CreateDate']) conn.commit() cursor.close() conn.close()
解决方案
- 更新ODBC驱动:错误中的
master.dbo.syscharsets是旧版SQL Server系统视图,Azure SQL Database不支持该视图,而旧版{SQL Server}驱动会尝试访问它。需改用针对Azure优化的驱动,推荐使用{ODBC Driver 17 for SQL Server}或更高版本,修改连接字符串的DRIVER部分:conn = pyodbc.connect('DRIVER={ODBC Driver 17 for SQL Server};SERVER=your-azure-sql-server-name.database.windows.net;DATABASE=MYDB;UID=' + keyring.get_password("azure", "UID") + ';PWD=' + keyring.get_password("azure", "PWD") + ';') - 修正SERVER参数:Azure SQL Database的服务器地址格式为
{server-name}.database.windows.net,需替换为你的Azure SQL服务器全名,而非本地IP。 - 验证权限与数据库:确保使用的账号拥有目标数据库的写入权限,且
MYDB已在Azure SQL实例中创建。 - 批量插入优化(可选):原代码逐行插入效率较低,针对Azure SQL可改用
executemany提升性能:cursor.executemany("INSERT INTO mytable([ID],[CreateDate]) values(?,?)", [(row['ID'], row['CreateDate']) for index, row in df_add.iterrows()])
内容的提问来源于stack exchange,提问作者PyBoss
相关产品推荐
相关产品推荐

