gpt4 book ai didi

mysql - 使用 Diesel、r2d2 和 r2d2-diesel 查询数据库时出错

转载 作者:行者123 更新时间:2023-11-29 01:36:13 28 4
gpt4 key购买 nike

我已经使用 diesel 的连接池系统设置了一个系统, r2d2 , 和 r2d2-diesel充当我的 Web 应用程序的 API 主机。我一直在关注这个 blog post作为帮助我进行设置的基础。但是,我已经为我的数据库后端切换到 MySQL 进行了修改;我已经添加了必要的柴油功能,并认为这不会成为问题。

这是我用来设置连接池的代码(与博文中的代码非常相似):

use diesel::prelude::*;
use diesel::mysql::MysqlConnection;
use r2d2::{ GetTimeout, Pool, PooledConnection, Config };
use r2d2_diesel::ConnectionManager;

pub struct DB(PooledConnection<ConnectionManager<MysqlConnection>>);

impl DB {
pub fn conn(&self) -> &MysqlConnection {
&*self.0
}
}

pub fn create_db_pool() -> Pool<ConnectionManager<MysqlConnection>> {
let config = Config::default();
let manager = ConnectionManager::<MysqlConnection>::new(format!("{}", DB_CREDENTIALS));
Pool::new(config, manager).expect("Failed to create pool.")
}

我在设置数据库接口(interface)系统的过程中遇到了一个问题。当我通过 diesel 对数据库进行任何查询时,出现以下错误:Err(DatabaseError(__Unknown, "Commands out of sync; you can\'t run this command now"))

我做了一些研究,似乎这个错误是在发送另一个查询之前没有读取以前的查询时发生的,这让我相信这可能是一个库错误。我检查了 MySQL 查询日志,除了在连接池中创建连接之外,我没有看到任何查询。

我已将我的错误简化为一个测试用例。以下响应我在上面粘贴的错误消息:

/// Make sure we can run basic queries on the database using a connection pool
#[test]
fn basic_queries() {
use diesel::connection::SimpleConnection;

let mut pool = create_db_pool();
let mut conn = pool.get().unwrap();
let res = conn.batch_execute("SELECT 1");
println!("{:?}", res);
}

运行如下查询会产生相同的错误消息,但要简化为单个测试用例要困难得多:

let query = diesel::insert(&beatmap).into(schema::beatmaps::dsl::beatmaps);
// println!("{:?}", query);
print_sql!(query);
let conn: &MysqlConnection = &*client.pool.get().expect("Unable to get connection from pool");
let res = query.execute(conn);

我认为这是我的实现错误,但这可能与我的数据库配置有关吗?我用于开发的数据库正在被超过 3 种语言和多个应用程序积极使用而没有问题,所以我对此表示怀疑。

最佳答案

编辑:这已在相关 crate 的最新版本中得到修复。

事实证明,r2d2-dieselis currently broken for MySQL .运行状况检查进行查询但从未读出结果,这会扰乱用户查询的 MySQL 命令顺序。

我创建了一个修复该问题的 r2d2-diesel 存储库的分支。它并非设计为长期解决方案,仅适用于 MySQL 客户端。如果您想使用它,请将以下内容添加到您的 Cargo.toml:

r2d2-diesel-mysql = { git = "https://github.com/Ameobea/r2d2-diesel" }

在您的代码库中将 r2d2_diesel 的所有实例更改为 r2d2_diesel_mysql,它应该可以作为替代品。

关于mysql - 使用 Diesel、r2d2 和 r2d2-diesel 查询数据库时出错,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/43268670/

28 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com