pandas - SQLAlchemy 中的 mssql+pyodbc 出现“数据源名称太长”错误
问题描述
我正在尝试使用 SQLAlchemy 和 pyobdc 将数据帧上传到 Azure SQL Server 数据库上的数据库。我已建立连接,但上传时出现错误提示
(pyodbc.Error) ('IM010', '[IM010] [Microsoft][ODBC Driver Manager] 数据源名称太长 (0) (SQLDriverConnect)')
我不确定这个错误来自哪里,因为我之前使用过 sqlalchemy 没有问题。我在下面附上了我的代码,有人可以帮我诊断问题吗?
username = 'bcadmin'
password = 'N@ncyR2D2'
endpoint = 'bio-powerbi-bigdata.database.windows.net'
engine = sqlalchemy.create_engine(f'mssql+pyodbc://{username}:{password}@{endpoint}')
df.to_sql("result_management_report",engine,if_exists='append',index=False)
我知道其他 ETL 方法,如数据工厂和 SSMS,但我更喜欢使用 pandas 作为 ETL 过程。
请帮我解决这个错误。
解决方案
这里有三个问题:
- 如果用户名或密码可能包含
@
字符,则需要在连接 URI 中对其进行转义。 - 对于
mssql+pyodbc
方言,数据库名称必须包含在 URI 中,以便 SQLAlchemy 识别“主机名”连接(而不是“DSN”连接)。 - 同样对于
mssql+pyodbc
主机名连接,必须使用driver
属性提供 ODBC 驱动程序名称。
构建正确连接 URI 的最简单方法是使用以下sqlalchemy.engine.url.URL
方法:
import sqlalchemy as sa
my_uid = "bcadmin"
my_pwd = "N@ncyR2D2"
my_host = "bio-powerbi-bigdata.database.windows.net"
my_db = "master"
my_odbc_driver = "ODBC Driver 17 for SQL Server"
connection_uri = sa.engine.url.URL(
"mssql+pyodbc",
username=my_uid,
password=my_pwd,
host=my_host,
database=my_db, # required; not an empty string
query={"driver": my_odbc_driver},
)
print(connection_uri)
"""console output:
mssql+pyodbc://bcadmin:N%40ncyR2D2@bio-powerbi-bigdata.database.windows.net/master?driver=ODBC+Driver+17+for+SQL+Server
"""
engine = sa.create_engine(connection_uri, fast_executemany=True)
推荐阅读
- sendgrid - 在 SendGrid 动态模板上查看自定义图像
- linux - 来自命令行的 rtspclientsink 测试管道
- c - “无效表达式的使用”:将数据从地址 1 复制到地址 2
- maven - Maven 无法将工件发布到 AWS S3
- javascript - 我的不和谐机器人不会停止向我的命令发送垃圾邮件
- azure-devops - Azure Devops 中的 Latexmk 退出代码 12
- python - tkinter- 获取 tkinter 中条目的维度
- python - 根据它们在另一个二维数组中的存在从二维数组中删除子数组(返回一个新的二维数组)
- android - 如何配置一个
xml中的布局 - javascript - 为什么我在 CSS 中的背景颜色没有被覆盖?另外,为什么“keypress”不起作用但“keydown”起作用?