• docker版jxTMS使用指南:python服务之访问数据库


    本文讲解4.0版jxTMS中python服务访问数据库,docker版jxTMS使用指南:4.0版升级内容

    docker版本的使用,请参考:docker版jxTMS使用指南

    上篇文章讲解了如何用jxMysq的ORM定义并利用其类函数、对象函数访问数据库,本文讲解如何自己执行数据库访问。

    当前,前提是自己对数据库、SQL比较熟悉。不过呢,jxTMS是docker镜像方式提供的,也就是说,真搞坏了,那删掉容器再重新启动一个新的就好了。

    引用:

    from jx.jxMysql import mysqlDB
    
    • 1

    mysqlDB是jxTMS提供的数据库连接修饰符,用该修饰符修饰的函数,将自动获得一个数据库连接,该函数就可使用此数据库连接来访问数据库;函数执行完毕,jxTMS会自动为该数据库连接做一次提交,即一个用mysqlDB修饰的函数中所有的数据库操作是一个数据库事务。

    上一章节中的ORM中所有对数据库的增改查操作,也都是通过mysqlDB修饰的。

    我们以ORM的类函数getByID函数为例来看一下mysqlDB是如何使用的:

    @classmethod
    @mysqlDB
    def getByID(cls,db,clsName,id):
        sql = f'SELECT * FROM {clsName} WHERE ID={id} limit 1'
        db.cursor.execute(sql)
        return db.cursor.fetchone()
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6

    大家请看一下上篇文章中所讲的getByID的签名:

    getByID(cls,dbName,clsName,id)
    
    • 1

    大家会发现:getByID在定义的时候,cls后的第一个参数是db,而调用时cls后的第一个参数是dbName。

    这就是mysqlDB所起的作用:mysqlDB会帮助被修饰的函数建立并管理数据库连接。

    以getByID为例,@mysqlDB给getByID函数添加了一个wrapper壳函数,在用户调用getByID时,这个wrapper壳函数会先得到执行:

    1、其用送入的dbName来查找数据连接池获取一个到该数据库的连接

    2、把这个数据库连接放入getByID参数表的第一个参数,将其它参数一并放入参数表,然后调用getByID函数

    3、如果getByID函数正确执行完毕,提交该数据库连接

    4、将getByID函数的返回值和True组成一个元组,返回给调用者

    5、如果getByID函数执行错误,则回滚,并将错误记入日志,然后返回(None,False)

    我们再举一个例子:上篇文章的getBy函数返回的是数据库中的数据,我们现在希望直接得到一个ORM对象,这样以后update、reset会非常方便。

    class Demo(ORM):
        _ormAttr = {
            'Name':'string',
            ...
        }
        def __init__(self,data=None):
            super(Demo , self).__init__(dbName,'Demo',data=data)
    
        @classmethod
        @mysqlDB
        def _getByName(cls,db,name):
            sql = f'SELECT * FROM Demo WHERE Name={name} limit 1'
            db.cursor.execute(sql)
            return db.cursor.fetchone()
    
        @classmethod
        def getByName(cls,name):
            rs,rc = cls._getByName(dbName,name)
            if rc and not rs is None:
    	        #上篇文章说过:查询得到的数据可以通过data()函数取得
    	        return Demo(data=rs)
    		 return None
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22

    调用Demo.getByName(name)就可以直接得到一个Demo的数据对象,然后调用set、update等函数来使用了,并可以用data()来获取查询到的数据。

    参考资料:

    jxTMS设计思想

    jxTMS编程手册

    下面的系列文章讲述了如何用jxTMS开发一个实用的业务功能:

    如何用jxTMS开发一个功能

    下面的系列文章讲述了jxTMS的一些基本开发能力:

    jxTMS的HelloWorld

  • 相关阅读:
    《痞子衡嵌入式半月刊》 第 56 期
    挂耳式蓝牙耳机哪家的好用,列举五款舒适度极佳的耳机分享
    基于评论文本的自适应特征提取推荐研究
    C语言IO操作fread/fwrite/fflush
    Note—— OSError & np.degress() & scipy.signal.argrelextrema
    栈的应用----括号匹配问题
    MySQL SQL语法基础
    关于Gitea 的简单介绍
    Flutter --- 配置多个Flutter SDK
    什么行业适合做谷歌SEO?
  • 原文地址:https://blog.csdn.net/jxandrew/article/details/130900199