Rust Rocket结合SQLx连接Azure MSSQL数据库的连接字符串配置问题
解决方法
错误原因
你遇到的Configuration(RelativeUrlWithoutBase)错误是因为SQLx的MSSQL驱动仅支持URL格式的连接字符串,不兼容你使用的ODBC风格键值对格式。
正确连接字符串写法
SQLx的MSSQL连接字符串统一使用mssql://作为前缀,标准格式如下:
mssql://<用户名>:<密码>@<服务器地址>:<端口>/<数据库名>?<可选参数>
适配你的Azure SQL场景的代码修改如下:
const SERVER: &str = "<mysqlserver>.database.windows.net"; const PORT: &str = "1433"; const USER: &str = "sqladmin"; const PASSWORD: &str = "<mypassword>"; const DATABASE: &str = "<mydatabase>"; // 末尾加encrypt=strict适配Azure SQL强制加密要求 let conn_str = format!("mssql://{}:{}@{}:{}/{}?encrypt=strict", USER, PASSWORD, SERVER, PORT, DATABASE); let conn = MssqlConnection::connect(&conn_str).await?;
额外注意事项
- 如果密码中包含
@、/、?、%等URL特殊字符,需要先对密码做URL编码后再拼接进连接串,避免解析错误。 - 如果你使用的是本地未开启加密的MSSQL测试环境,可以将参数替换为
encrypt=off。 - 除了直接拼接字符串,你也可以使用
MssqlConnectOptions结构体手动设置各配置项,避免字符串拼接的安全风险,对应配置如下:
use sqlx::mssql::{MssqlConnectOptions, MssqlEncrypt}; let options = MssqlConnectOptions::new() .host(SERVER) .port(PORT.parse().unwrap()) .username(USER) .password(PASSWORD) .database(DATABASE) .encrypt(MssqlEncrypt::Strict); let conn = MssqlConnection::connect_with(options).await?;
内容的提问来源于stack exchange,提问作者picklepick
相关产品推荐
相关产品推荐

