使用sqlalchemy-diff对比数据库schema报rfc1738 URL解析错误如何解决
报错根因
你当前使用的是SQL Server专用的ODBC连接串格式,而sqlalchemy要求传入符合RFC1738标准的URL格式连接串,格式不匹配导致解析失败。
解决步骤
- 首先安装对应依赖,根据你选择的驱动安装:
用pymssql驱动执行:pip install pymssql sqlalchemy-diff
用pyodbc驱动执行:pip install pyodbc sqlalchemy-diff(需提前在系统中安装ODBC Driver for SQL Server) - 替换原有连接串为SQLAlchemy支持的URL格式,通用结构为:
mssql+[驱动名]://[用户名]:[密码]@[服务器地址]:[端口]/[数据库名]?[额外参数] - 以下是适配后的完整代码示例:
from pprint import pprint from sqlalchemydiff import compare # pymssql驱动适配示例,二选一即可 DBURI1 = "mssql+pymssql://myuser:mypassword@my-sql-server.database.windows.net:1433/my-dev-sql-db?charset=utf8" DBURI2 = "mssql+pymssql://myuser:mypassword@my2-sql-server.database.windows.net:1433/my2-dev-sql-db?charset=utf8" # pyodbc驱动适配示例 # DBURI1 = "mssql+pyodbc://myuser:mypassword@my-sql-server.database.windows.net:1433/my-dev-sql-db?driver=ODBC+Driver+18+for+SQL+Server&Encrypt=yes&TrustServerCertificate=no" # DBURI2 = "mssql+pyodbc://myuser:mypassword@my2-sql-server.database.windows.net:1433/my2-dev-sql-db?driver=ODBC+Driver+18+for+SQL+Server&Encrypt=yes&TrustServerCertificate=no" result = compare(DBURI1, DBURI2) if result.is_match: print('Databases are identical') else: print('Databases are different') pprint(result.errors)
注意事项
- 如果密码中包含
@、/、:等URL特殊字符,需要先做URL编码转义,比如将@替换为%40,/替换为%2F,避免解析错误。 - Azure SQL默认要求加密连接,使用pyodbc驱动时必须携带
Encrypt=yes参数,否则会连接失败。
内容的提问来源于stack exchange,提问作者Kenny_I
相关产品推荐
相关产品推荐

