GithubHelp home page GithubHelp logo

Comments (17)

zhuxiujia avatar zhuxiujia commented on May 23, 2024

比如:
#[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.

zhuxiujia avatar zhuxiujia commented on May 23, 2024

1.5.6版本,现已支持

from rbatis.

Silentdoer avatar Silentdoer commented on May 23, 2024

看了下实现,会自动封装返回值为Result,那如果查询单条数据没有找到的话是返回Err吗?Err里是否有获取数据失败的详情呢?还有就是目前的是要求显式给出RB的当前可用路径(对象路径),也就是限制死了一个mapper方法只能是针对一个pool,但是有这样的情况,有的时候一个mapper可能打到a库,有的时候打到b库去操作(比如读写分离),是不是应该提供一个不需要显示提供RB,然后需要参数里提供的宏?

from rbatis.

zhuxiujia avatar zhuxiujia commented on May 23, 2024

看了下实现,会自动封装返回值为Result,那如果查询单条数据没有找到的话是返回Err吗?Err里是否有获取数据失败的详情呢?还有就是目前的是要求显式给出RB的当前可用路径(对象路径),也就是限制死了一个mapper方法只能是针对一个pool,但是有这样的情况,有的时候一个mapper可能打到a库,有的时候打到b库去操作(比如读写分离),是不是应该提供一个不需要显示提供RB,然后需要参数里提供的宏?

首先必须返回Error,比如数据库长连接断线,数据库sql执行异常。至于返回None数据你可以定义返回结构为 rust Option<Model> 这样的类型。返回的结果只有满足能被serde_json序列化 几乎所有数据都可以返回。

from rbatis.

zhuxiujia avatar zhuxiujia commented on May 23, 2024

看了下实现,会自动封装返回值为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.

zhuxiujia avatar zhuxiujia commented on May 23, 2024

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.

Silentdoer avatar Silentdoer commented on May 23, 2024

那比如有这种情况,我一个服务需要定时同步其他库的数据到自己库里,所以一个select语句需要能支持两个数据源,这种用目前的方式就不好弄吧,除非一个SQL方法些两次,而且actix里支持将局部的pool放到app_data里,不需要弄成全局的lazy_static

from rbatis.

zhuxiujia avatar zhuxiujia commented on May 23, 2024

那比如有这种情况,我一个服务需要定时同步其他库的数据到自己库里,所以一个select语句需要能支持两个数据源,这种用目前的方式就不好弄吧,除非一个SQL方法些两次,而且actix里支持将局部的pool放到app_data里,不需要弄成全局的lazy_static

贴上来个示例的代码看看,我觉得你的问题,应该用wrapper(Wrapper也一样能设置原生sql滴,而且灵活) 来复用,不应该写成 这种形式呀

from rbatis.

zhuxiujia avatar zhuxiujia commented on May 23, 2024

那比如有这种情况,我一个服务需要定时同步其他库的数据到自己库里,所以一个select语句需要能支持两个数据源,这种用目前的方式就不好弄吧,除非一个SQL方法些两次,而且actix里支持将局部的pool放到app_data里,不需要弄成全局的lazy_static

actix的pool 看起来和全局的pool没什么区别吧,它是用Arc来克隆访问原始对象的,估计也用到了锁之类的(如果读写锁还是比较理想,如果是用了互斥锁那就比较糟糕了。我不太清楚,可以看看他的源码),和全局访问链接池没区别。
而且 r2d2连接池还是同步链接的,没有用到async await异步的形式。
Rbatis内部已经解决了 多线程竞争问题,内部的Context为DashMap类型(内部是读写锁实现 读多写少) 而内部的HashMap在程序运行前写,程序启动后只读的(不存在竞争)

from rbatis.

zhuxiujia avatar zhuxiujia commented on May 23, 2024

那比如有这种情况,我一个服务需要定时同步其他库的数据到自己库里,所以一个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.

Silentdoer avatar Silentdoer commented on May 23, 2024

好的,多谢。

from rbatis.

Silentdoer avatar Silentdoer commented on May 23, 2024

问下只有py_sql能传参数吗?普通sql可以传吗?

from rbatis.

zhuxiujia avatar zhuxiujia commented on May 23, 2024

问下只有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.

Silentdoer avatar Silentdoer commented on May 23, 2024

不好意思我没表述清楚,我是指sql这个宏的方法是否也支持rbatis: &Rbatis外部传pool进去呢?

from rbatis.

zhuxiujia avatar zhuxiujia commented on May 23, 2024

不好意思我没表述清楚,我是指sql这个宏的方法是否也支持rbatis: &Rbatis外部传pool进去呢?

你看我贴的代码,是的,能传Rbatis的引用,和事务id号tx_id

from rbatis.

Silentdoer avatar Silentdoer commented on May 23, 2024

好的,谢谢,框架很完美了😂

from rbatis.

zhuxiujia avatar zhuxiujia commented on May 23, 2024

好的,谢谢,框架很完美了😂

我制作了rbatis专用的文档网站
https://rbatis.github.io/rbatis.io/#/

细节部分的语法表格大部分都列举了,希望能帮到你

from rbatis.

Related Issues (20)

Recommend Projects

  • React photo React

    A declarative, efficient, and flexible JavaScript library for building user interfaces.

  • Vue.js photo Vue.js

    🖖 Vue.js is a progressive, incrementally-adoptable JavaScript framework for building UI on the web.

  • Typescript photo Typescript

    TypeScript is a superset of JavaScript that compiles to clean JavaScript output.

  • TensorFlow photo TensorFlow

    An Open Source Machine Learning Framework for Everyone

  • Django photo Django

    The Web framework for perfectionists with deadlines.

  • D3 photo 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.

  • Game

    Some thing interesting about game, make everyone happy.

Recommend Org

  • Facebook photo Facebook

    We are working to build community through open source technology. NB: members must have two-factor auth.

  • Microsoft photo Microsoft

    Open source projects and samples from Microsoft.

  • Google photo Google

    Google ❤️ Open Source for everyone.

  • D3 photo D3

    Data-Driven Documents codes.