11 个版本 (3 个稳定版)

1.0.2 2020年4月25日
1.0.1 2020年3月17日
1.0.0 2020年2月12日
0.4.1 2020年2月7日
0.1.1 2019年7月7日

#1095解析器实现

Download history 783/week @ 2024-03-13 439/week @ 2024-03-20 444/week @ 2024-03-27 559/week @ 2024-04-03 920/week @ 2024-04-10 865/week @ 2024-04-17 717/week @ 2024-04-24 718/week @ 2024-05-01 761/week @ 2024-05-08 832/week @ 2024-05-15 568/week @ 2024-05-22 433/week @ 2024-05-29 398/week @ 2024-06-05 572/week @ 2024-06-12 691/week @ 2024-06-19 373/week @ 2024-06-26

每月下载量:2,110
用于 6 个 crate(5 个直接使用)

BSD-3-Clause

15KB
222

DSN (数据源名称) 解析器

crates.io Build Status docs

DSN 格式

<driver>://<username>:<password>@<protocol>(<address>)/<database>?param1=value1&...&paramN=valueN

完整的 DSN 格式

driver://username:password@protocol(address)/dbname?param=value

地址根据协议而变化

对于 TCP/UDP 地址形式为 host:port,例如

pgsql://user:pass@tcp(localhost:5555)/dbname

对于协议 unix(Unix 域套接字)的地址是套接字的绝对路径,例如

mysql://user@unix(/path/to/socket)/database

对于协议 file(sqlite)使用绝对路径作为地址,例如

sqlite://@file(/full/unix/path/to/file.db)

百分号编码

使用百分号编码用户名和密码,例如 @ 等字符,例如如果密码是

!A4T@hh'cUj7LXXvk"

从命令行可以编码为

echo -n "\!A4T@hh'cUj7LXXvk\"" | jq -s -R -r @uri

echo -n "\!A4T@hh'cUj7LXXvk\"" | xxd -p |sed 's/../%&/g'

然后可以构建 dsn

mysql://root:!A4T%40hh'cUj7LXXvk%22@tcp(10.0.0.1:3306)/test

mysql://root:%21%41%34%54%40%68%68%27%63%55%6a%37%4c%58%58%76%6b%22@tcp(10.0.0.1:3306)/test

使用 mysql create 的示例 crates.io

DSN

mysql://user:password@tcp(db.example.com)/mydb?tls=skip-verify

代码

// if using clap asking for the DSN as an argument
let dsn = matches.value_of("DSN").unwrap();
let dsn = dsn::parse(dsn).unwrap_or_else(|e| {
    eprintln!("{}", e);
    process::exit(1);
});

let mut opts = mysql::OptsBuilder::new();
opts.user(dsn.username);
opts.pass(dsn.password);
opts.ip_or_hostname(dsn.host);
if let Some(port) = dsn.port {
    opts.tcp_port(port);
}
opts.socket(dsn.socket);
opts.db_name(dsn.database);

// mysql ssl options
let mut ssl_opts = mysql::SslOpts::default();
if let Some(tls) = dsn.params.get("tls") {
    if *tls == "skip-verify" {
        ssl_opts.set_danger_accept_invalid_certs(true);
    }
}
opts.ssl_opts(ssl_opts);

let pool = mysql::Pool::new_manual(3, 50, opts).unwrap_or_else(|e| {
    eprintln!("Could not connect to MySQL: {}", e);
    process::exit(1);
});

依赖

~14KB