在Windows10中使用rust的diesel库

cnblogs 2024-09-19 16:39:00 阅读 91

介绍

最近在学习Actix Web时,需要用到数据库操作,简单尝试了一下diesel,也遇到了一些问题。在这里记录一下,供大家参考。

1.安装

根据Diesel官网介绍,使用cargo binstall安装diesel cli

<code>cargo binstall diesel_cli

如果报错 error: no such command: `binstall` 需要先安装cargo-binstall库,再安装diesel_cli

<code>cargo install cargo-binstall

建议使用binstall安装,会根据系统找到正确的二进制文件。

2.项目中使用diesel

新建项目或者使用已有项目。

添加依赖

在Cargo.toml中,添加diesel依赖项

<code>[dependencies]

diesel = { version = "2.2.4", features = ["mysql"] }

dotenvy = "0.15.7"

创建.env文件

在项目中,创建.env文件,并将数据库URL配置信息保存到文件中

DATABASE_URL=mysql://username:password@server_ip/database_name

配置好之后,执行diesel cli命令

diesel setup

此时大概率会遇到报错(忘记截图了),原因在diesel连接数据库时,找不到libmysqlclient。

如果此时,尝试执行cargo build同样也会报错,报错原因是diesel这个crate的依赖mysqlclient-sys build失败,查看失败日志,同样是由于找不到libmysqlclient。

安装libmysqlclient

通过github上mysqlclient-sys的README中的描述,通过vcpkg命令安装libmysqlclient

vcpkg install libmysql:x64-windows-static-md

安装后查看已安装的内容,已安装好mysqlclient的lib文件

此时执行<code>diesel setup不再报错,但是cargo build还会报错仍然是找不到libmysqlclient,原因是由于在cargo build时,需要指定mysqlclient.lib的位置。在环境变量中配置MYSQLCLIENT_LIB_DIRMYSQLCLIENT_VERSION

配置完环境变量后,不再报找不到libmysqlclient库,出现的新的问题。如:

error LNK2019: 无法解析的外部符号 __imp_CertOpenStore,函数 capi_open_store 中引用了该符号

熟悉C++的朋友对这些报错肯定不陌生,是比较常见的链接错误,在Visual Studio中可以通过项目配置附加依赖项解决。

在rust的build过程报错,同样需要在rust项目中进行配置。

通过缺少的依赖,确定是win10 SDK中的lib,分别是Crypt32.libUser32.lib,找到两个lib文件所在的目录(不同机器上版本号可能不同,替换自己即可)

C:\Program Files (x86)\Windows Kits\10\Lib\10.0.19041.0\um\x64

在项目中创建build.rs文件,在文件中加入如下内容

<code>fn main() {

println!("cargo:rustc-link-search=native=C:\\Program Files (x86)\\Windows Kits\\10\\Lib\\10.0.19041.0\\um\\x64");

println!("cargo:rustc-link-lib=crypt32");

println!("cargo:rustc-link-lib=user32");

}

并在Cargo.toml文件的package中指定build.rs,如:

[package]

name = "diesel_demo"

version = "0.1.0"

edition = "2021"

build= "build.rs"

完成上述操作后,再次执行cargo build,成功build。

总结

至此,win10操作系统中,在rust项目diesel crate操作数据库已调通。后续根据diesel官网的例子,可以进行CRUD操作。



声明

本文内容仅代表作者观点,或转载于其他网站,本站不以此文作为商业用途
如有涉及侵权,请联系本站进行删除
转载本站原创文章,请注明来源及作者。