Comments (17)
比如:
#[query(sql="select* from xxx where name = $1")]
Option selectXxxByName(name: String) {None}然后宏会改造这个函数为类似:
Option selectXxxByName(name:String, pool:Rbatis) {
Some(pool.select(....))
}
好主意,理论上是可以的,估计需要指定Rbatis地址,例如#[query(sql="select* from xxx where name = $1",rbatis=RB)]
from rbatis.
1.5.6版本,现已支持
from rbatis.
看了下实现,会自动封装返回值为Result,那如果查询单条数据没有找到的话是返回Err吗?Err里是否有获取数据失败的详情呢?还有就是目前的是要求显式给出RB的当前可用路径(对象路径),也就是限制死了一个mapper方法只能是针对一个pool,但是有这样的情况,有的时候一个mapper可能打到a库,有的时候打到b库去操作(比如读写分离),是不是应该提供一个不需要显示提供RB,然后需要参数里提供的宏?
from rbatis.
看了下实现,会自动封装返回值为Result,那如果查询单条数据没有找到的话是返回Err吗?Err里是否有获取数据失败的详情呢?还有就是目前的是要求显式给出RB的当前可用路径(对象路径),也就是限制死了一个mapper方法只能是针对一个pool,但是有这样的情况,有的时候一个mapper可能打到a库,有的时候打到b库去操作(比如读写分离),是不是应该提供一个不需要显示提供RB,然后需要参数里提供的宏?
首先必须返回Error,比如数据库长连接断线,数据库sql执行异常。至于返回None数据你可以定义返回结构为 rust Option<Model>
这样的类型。返回的结果只有满足能被serde_json序列化 几乎所有数据都可以返回。
from rbatis.
看了下实现,会自动封装返回值为Result,那如果查询单条数据没有找到的话是返回Err吗?Err里是否有获取数据失败的详情呢?还有就是目前的是要求显式给出RB的当前可用路径(对象路径),也就是限制死了一个mapper方法只能是针对一个pool,但是有这样的情况,有的时候一个mapper可能打到a库,有的时候打到b库去操作(比如读写分离),是不是应该提供一个不需要显示提供RB,然后需要参数里提供的宏?
读写分离的问题,为什么不写一个代理RB的方法,在代理方法内实现路由选择数据库的逻辑呢?
实测可以编译通过例如,
pub struct PbProxy{
// ReadRB:Rbatis,
// WriteRB:Rbatis
}
impl PbProxy{
pub async fn py_fetch<T>(&self, tx_id: &str, py: &str, arg: &serde_json::Value) -> Result<T, rbatis_core::Error> where T: DeserializeOwned{
//实现你的路由选择数据库逻辑
unimplemented!()
}
}
宏生成的代码只有2个调用函数,只需要rust写一个代理模式可以替代fetch_prepare,exec_prepare方法
而且,我咋感觉 路由选择要放宏生成的方法里 似乎有点复杂,还没想好
from rbatis.
1.5.7 新增了py_sql() 宏,可以在sql表达式内部加入 if for_each等等动态sql判断
#[py_sql(RB, "select * from biz_activity where id = #{name}
if name != '':
and name=#{name}")]
fn py_select(name: &str) -> Option<BizActivity> {}
from rbatis.
那比如有这种情况,我一个服务需要定时同步其他库的数据到自己库里,所以一个select语句需要能支持两个数据源,这种用目前的方式就不好弄吧,除非一个SQL方法些两次,而且actix里支持将局部的pool放到app_data里,不需要弄成全局的lazy_static
from rbatis.
那比如有这种情况,我一个服务需要定时同步其他库的数据到自己库里,所以一个select语句需要能支持两个数据源,这种用目前的方式就不好弄吧,除非一个SQL方法些两次,而且actix里支持将局部的pool放到app_data里,不需要弄成全局的lazy_static
贴上来个示例的代码看看,我觉得你的问题,应该用wrapper(Wrapper也一样能设置原生sql滴,而且灵活) 来复用,不应该写成 这种形式呀
from rbatis.
那比如有这种情况,我一个服务需要定时同步其他库的数据到自己库里,所以一个select语句需要能支持两个数据源,这种用目前的方式就不好弄吧,除非一个SQL方法些两次,而且actix里支持将局部的pool放到app_data里,不需要弄成全局的lazy_static
actix的pool 看起来和全局的pool没什么区别吧,它是用Arc来克隆访问原始对象的,估计也用到了锁之类的(如果读写锁还是比较理想,如果是用了互斥锁那就比较糟糕了。我不太清楚,可以看看他的源码),和全局访问链接池没区别。
而且 r2d2连接池还是同步链接的,没有用到async await异步的形式。
Rbatis内部已经解决了 多线程竞争问题,内部的Context为DashMap类型(内部是读写锁实现 读多写少) 而内部的HashMap在程序运行前写,程序启动后只读的(不存在竞争)
from rbatis.
那比如有这种情况,我一个服务需要定时同步其他库的数据到自己库里,所以一个select语句需要能支持两个数据源,这种用目前的方式就不好弄吧,除非一个SQL方法些两次,而且actix里支持将局部的pool放到app_data里,不需要弄成全局的lazy_static
新版即将实现 传入Rbatis全局引用和Rbatis参数引用(应该能满足你的读写分离要求,分库分表(新版支持Sql拦截器插件))
例如:
/// 使用参数变量例子(rbatis 名称必须和参数里的rbatis名称一样)
#[py_sql(rbatis, "select * from biz_activity where id = #{name}
if name != '':
and name=#{name}")]
fn py_select(rbatis: &Rbatis, name: &str) -> Option<BizActivity> {}
from rbatis.
好的,多谢。
from rbatis.
问下只有py_sql能传参数吗?普通sql可以传吗?
from rbatis.
问下只有py_sql能传参数吗?普通sql可以传吗?
普通sql可以,但是普通sql参数数量要和sql里面用到的?符号数量相等对齐(除&Rbatis引用 tx_id:&str 外)。
相对来说 py_sql 简单多的多,不需要使用?,而是使用#{} 或者${}对应即可(取不到则值为NULL),和mybatis用法类似
举个example/crud_test.rs里面的例子:
#[py_sql(rbatis, "SELECT a1.name AS name,a2.create_time AS create_time
FROM test.biz_activity a1 , biz_activity a2
WHERE a1.id=a2.id and a1.name=#{name}")]
fn join_select(rbatis: &Rbatis, name: &str) -> Option<Vec<BizActivity>> {}
#[async_std::test]
pub async fn test_join() {
fast_log::log::init_log("requests.log", &RuntimeType::Std);
RB.link("mysql://root:123456@localhost:3306/test").await.unwrap();
let results = join_select(&RB, "test").await.unwrap();
println!("data: {:?}", results);
}
from rbatis.
不好意思我没表述清楚,我是指sql这个宏的方法是否也支持rbatis: &Rbatis外部传pool进去呢?
from rbatis.
不好意思我没表述清楚,我是指sql这个宏的方法是否也支持rbatis: &Rbatis外部传pool进去呢?
你看我贴的代码,是的,能传Rbatis的引用,和事务id号tx_id
from rbatis.
好的,谢谢,框架很完美了😂
from rbatis.
好的,谢谢,框架很完美了😂
我制作了rbatis专用的文档网站
https://rbatis.github.io/rbatis.io/#/
细节部分的语法表格大部分都列举了,希望能帮到你
from rbatis.
Related Issues (20)
- MSSQL using transactions error: token error: 'Incorrect syntax near 'begin'.' on server MSSQL2016 executing on line 1 (code: 102, state: 1, class: 15) HOT 2
- crud insert is error when the primary key column name is not id
- html_sql can't trim uppercase "and|or" after where HOT 1
- htmlsql_select_page field is filtered problem HOT 2
- The json field of the database is returned as an escaped string HOT 2
- Setting result error using py_sql with single result HOT 1
- Is there any synchronized Chinese document? HOT 3
- Unable to update column to null.
- Prior code to get SQLite version using sqlite_version() works. Now broken. [Solved Manually. See comments] HOT 2
- test_decode_time_zone error
- Variable `recordsValue` should have snake_case name, e.g. `records_value` HOT 5
- Common field processing issues HOT 2
- The document needs to be updated HOT 2
- How to dynamically specify schema HOT 14
- add return primary key value in postgresql HOT 1
- How to use tracing log in rbatis-v4 version HOT 2
- field value with json string, return invalid type: map, expected String error HOT 2
- Setting the maximum connection pool doesn't work well HOT 3
- Hello, I encountered an issue with a plugin dynamically modifying SQL HOT 4
- MySQL keeps re-establishing connections HOT 5
Recommend Projects
-
React
A declarative, efficient, and flexible JavaScript library for building user interfaces.
-
Vue.js
🖖 Vue.js is a progressive, incrementally-adoptable JavaScript framework for building UI on the web.
-
Typescript
TypeScript is a superset of JavaScript that compiles to clean JavaScript output.
-
TensorFlow
An Open Source Machine Learning Framework for Everyone
-
Django
The Web framework for perfectionists with deadlines.
-
Laravel
A PHP framework for web artisans
-
D3
Bring data to life with SVG, Canvas and HTML. 📊📈🎉
-
Recommend Topics
-
javascript
JavaScript (JS) is a lightweight interpreted programming language with first-class functions.
-
web
Some thing interesting about web. New door for the world.
-
server
A server is a program made to process requests and deliver data to clients.
-
Machine learning
Machine learning is a way of modeling and interpreting data that allows a piece of software to respond intelligently.
-
Visualization
Some thing interesting about visualization, use data art
-
Game
Some thing interesting about game, make everyone happy.
Recommend Org
-
Facebook
We are working to build community through open source technology. NB: members must have two-factor auth.
-
Microsoft
Open source projects and samples from Microsoft.
-
Google
Google ❤️ Open Source for everyone.
-
Alibaba
Alibaba Open Source for everyone
-
D3
Data-Driven Documents codes.
-
Tencent
China tencent open source team.
from rbatis.