Mysql 如何使用Diesel生成和解析原始SQL查询?
我正在用火箭框架测试锈迹。对于数据库,我使用Diesel与MySQL数据库交互 下面举几个例子,有很多事情发生在幕后。我有一个MySQL数据库,它运行着一个填充的表,我想对这些表进行原始查询 以下代码有效:Mysql 如何使用Diesel生成和解析原始SQL查询?,mysql,rust,rust-diesel,Mysql,Rust,Rust Diesel,我正在用火箭框架测试锈迹。对于数据库,我使用Diesel与MySQL数据库交互 下面举几个例子,有很多事情发生在幕后。我有一个MySQL数据库,它运行着一个填充的表,我想对这些表进行原始查询 以下代码有效: use diesel::{prelude::*}; mod schema { table! { organization { id -> Nullable<Integer>, name -> T
use diesel::{prelude::*};
mod schema {
table! {
organization {
id -> Nullable<Integer>,
name -> Text,
country -> Text,
}
}
}
use self::schema::organization;
use self::schema::organization::dsl::{organization as all_orgs};
#[table_name="organization"]
#[derive(Serialize, Deserialize, Queryable, Insertable, Debug, Clone)]
pub struct Organization {
pub id: Option<i32>,
pub name: String,
pub country: String
}
impl Organization {
pub fn all(conn: &MysqlConnection) -> Vec<Organization> {
all_orgs.order(organization).load::<Organization>(conn).unwrap()
}
}
然而,在进行此更改的货物运行时
,我面临:
error[E0277]:绑定的特性“&diesel::MysqlConnection:diesel::Connection”不满足
-->src/org.rs:26:19
|
26 |。加载(和连接)。展开()
| -^^^^
| |
|没有为`&diesel::MysqlConnection`实现特性'diesel::Connection'`
帮助:考虑删除“前导”和“参考”
|
=帮助:找到了以下实现:
=注意:由于对`SqlQuery`的`LoadQuery` impl的要求,因此需要`
错误[E0277]:不满足特性绑定的'Organization:QueryableByName'
-->src/org.rs:26:14
|
26 |。加载(和连接)。展开()
|^^^^未为`组织'实现特性'QueryableByName'`
|
=注意:由于对`SqlQuery`的`LoadQuery` impl的要求,因此需要`
在允许我执行原始SQL查询并从函数中正确解析它的同时,如何满足这些错误,给定输入参数和所需输出?要解决您的问题,您可以删除
.order(organization)
,以避免执行排序
要明确回答问题,请执行以下操作:错误消息提到两个问题:
error[E0277]:绑定的特性“&diesel::MysqlConnection:diesel::Connection”不满足
-->src/org.rs:26:19
|
26 |。加载(和连接)。展开()
| -^^^^
| |
|没有为`&diesel::MysqlConnection`实现特性'diesel::Connection'`
帮助:考虑删除“前导”和“参考”
|
=帮助:找到了以下实现:
=注意:由于对`SqlQuery`的`LoadQuery` impl的要求,因此需要`
这个问题很容易解决:按照编译器的建议去做,删除对.load(&conn)
调用的前导&
引用
error[E0277]:不满足特性绑定'Organization:QueryableByName'
-->src/org.rs:26:14
|
26 |。加载(和连接)。展开()
|^^^^未为`组织'实现特性'QueryableByName'`
|
=注意:由于对`SqlQuery`的`LoadQuery` impl的要求,因此需要`
这一条指出了一个实际问题,即在您的组织中不允许加载结果。Diesel需要被告知如何从查询响应中构造组织结构。柴油机为此提供了两个特点:
- 用于根据类型安全查询的结果构造结构(=使用diesel提供的dsl生成的查询,以便在编译时对其进行检查)`李>
- 从非类型安全查询的结果构造结构(因此基本上是通过
diesel::sql\u query执行的查询)
正如错误消息所提到的,您的结构没有实现QueryableByName
,这是在该结构中加载diesel::sql\u query
的结果所必需的。你需要实现这个特性。最简单的选择是使用Diesel提供的派生
您的代码的固定版本如下所示:
使用diesel::{prelude::*,sql\u query};
模式模式{
桌子{
组织机构{
id->可为空,
名称->文本,
国家->文本,
}
}
}
使用self::schema::organization;
#[表_name=“组织”]
#[派生(序列化、反序列化、可查询、可查询ByName、可插入、调试、克隆)]
发布结构组织{
pub id:Option,
酒吧名称:String,
酒吧国家:字符串
}
impl组织{
pub fn all(连接:&MysqlConnection)->Vec{
sql_查询(“从组织中选择id、名称、国家”)
.load(&conn).展开()
}
}
我不需要按任何方式订购-为什么不删除.order(organization)
行呢?哇,就是这么简单。。我想得太多了。谢谢你的帮助,请回答问题,我会接受!但这并不能回答你的问题。它只会解决你的问题。
use diesel::{prelude::*, sql_query};
mod schema {
table! {
organization {
id -> Nullable<Integer>,
name -> Text,
country -> Text,
}
}
}
use self::schema::organization;
#[table_name="organization"]
#[derive(Serialize, Deserialize, Queryable, Insertable, Debug, Clone)]
pub struct Organization {
pub id: Option<i32>,
pub name: String,
pub country: String
}
impl Organization {
pub fn all(conn: &MysqlConnection) -> Vec<Organization> {
sql_query("SELECT id, name, country FROM organization")
.load(&conn).unwrap()
}
}