【问题标题】:"Data source name too long" error with mssql+pyodbc in SQLAlchemySQLAlchemy 中的 mssql+pyodbc 出现“数据源名称太长”错误
【发布时间】:2020-06-29 22:19:41
【问题描述】:

我正在尝试使用 SQLAlchemy 和 pyobdc 将数据帧上传到 Azure SQL Server 数据库上的数据库。我已建立连接,但上传时出现错误提示

(pyodbc.Error) ('IM010', '[IM010] [Microsoft][ODBC Driver Manager] Data source name too long (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 过程。

请帮我解决这个错误。

【问题讨论】:

  • 也许尝试在端点名称后显式添加:1433。看起来 SQLA/pyodbc 正在将服务器名称解释为 DSN 名称。
  • 转义密码,其中包含@
  • @IljaEverilä 我尝试转义密码,但没有解决错误。添加 :1433 也无济于事。我想知道问题可能是什么。
  • 您的 URL 缺少将其与 DSN 连接区分开来所需的尾随 /,因此主机名被视为 DSN(请参阅 docs.sqlalchemy.org/en/13/dialects/…)。
  • @IljaEverilä 嗨,Ilja 我尝试了尾随 /,但它似乎也不起作用。我迷路了。

标签: pandas sqlalchemy azure-sql-database etl pyodbc


【解决方案1】:

这里有三个问题:

  1. 如果用户名或密码可能包含 @ 字符,则需要在连接 URI 中对其进行转义。
  2. 对于mssql+pyodbc 方言,数据库名称必须包含在 URI 中,以便 SQLAlchemy 识别“主机名”连接(而不是“DSN”连接)。
  3. 同样对于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)

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-05-30
    • 1970-01-01
    • 2015-09-04
    • 2020-01-11
    • 1970-01-01
    • 2015-10-22
    相关资源
    最近更新 更多