Pandas &引用;“数据源名称太长”;mssql+错误;炼金术中的pyodbc

Pandas &引用;“数据源名称太长”;mssql+错误;炼金术中的pyodbc,pandas,sqlalchemy,azure-sql-database,etl,pyodbc,Pandas,Sqlalchemy,Azure Sql Database,Etl,Pyodbc,我正在尝试使用SQLAlchemy和pyobdc将数据帧上载到Azure SQL Server数据库上的数据库。我已经建立了连接,但当上传时,我得到一个错误,上面写着 (pyodbc.Error)('IM010'、'[IM010][Microsoft][ODBC驱动程序管理器]数据源名称太长(0)(SQLDriverConnect) 我不确定这个错误是从哪里来的,因为我以前使用过sqlalchemy,没有任何问题。我在下面附上了我的代码,有人能帮我诊断这个问题吗 username = 'bcad

我正在尝试使用SQLAlchemy和pyobdc将数据帧上载到Azure SQL Server数据库上的数据库。我已经建立了连接,但当上传时,我得到一个错误,上面写着

(pyodbc.Error)('IM010'、'[IM010][Microsoft][ODBC驱动程序管理器]数据源名称太长(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
    方法:

    将sqlalchemy作为sa导入
    my_uid=“bcadmin”
    我的_pwd=”N@ncyR2D2"
    my_host=“bio powerbi bigdata.database.windows.net”
    my_db=“master”
    my_odbc_driver=“SQL Server的odbc驱动程序17”
    连接_uri=sa.engine.url.url(
    “mssql+pyodbc”,
    用户名=我的uid,
    密码=我的密码,
    主机=我的主机,
    database=my_db,#必需;不是空字符串
    query={“driver”:my_odbc_driver},
    )
    打印(连接uri)
    “”“控制台输出:
    mssql+pyodbc://bcadmin:N%40ncyR2D2@bio powerbi bigdata.database.windows.net/master?driver=ODBC+driver+17+for+SQL+Server
    """
    engine=sa.create\u engine(连接uri,fast\u executemany=True)
    
    也许可以尝试在端点名称后显式添加
    :1433
    。看起来SQLA/pyodbc正在将服务器名称解释为DSN名称。请转义您的密码,它包含
    @
    @IljaEverilä我尝试转义密码,但没有修复错误。加上:1433也没有帮助。我想知道可能是什么问题。您的URL缺少区分它与DSN连接所需的尾随
    /
    ,因此主机名被视为DSN(请参阅)。@IljaEveriläHi Ilja我尝试了尾随/但似乎也不起作用。我迷路了。