我正在尝试使用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,但我更喜欢使用panda作为ETL过程。
请帮我纠正这个错误。
这里有三个问题:
- 如果用户名或密码可能包含
@
字符,则需要在连接URL中对其进行转义 - 对于
mssql+pyodbc
方言,数据库名称必须包括在URL中,以便SQLAlchemy识别";主机名";连接(与"DSN"连接相反( - 同样,对于
mssql+pyodbc
主机名连接,必须使用driver
属性提供ODBC驱动程序名称
建立正确连接URL的最简单方法是使用URL.create()
方法:
from sqlalchemy import create_engine
from sqlalchemy.engine import URL
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_url = URL.create(
"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_url)
"""console output:
mssql+pyodbc://bcadmin:N%40ncyR2D2@bio-powerbi-bigdata.database.windows.net/master?driver=ODBC+Driver+17+for+SQL+Server
"""
engine = create_engine(connection_url, fast_executemany=True)