本文讲解4.0版jxTMS中python服务访问数据库,docker版jxTMS使用指南:4.0版升级内容
docker版本的使用,请参考:docker版jxTMS使用指南
上篇文章讲解了如何用jxMysq的ORM定义并利用其类函数、对象函数访问数据库,本文讲解如何自己执行数据库访问。
当前,前提是自己对数据库、SQL比较熟悉。不过呢,jxTMS是docker镜像方式提供的,也就是说,真搞坏了,那删掉容器再重新启动一个新的就好了。
引用:
from jx.jxMysql import mysqlDB
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()
大家请看一下上篇文章中所讲的getByID的签名:
getByID(cls,dbName,clsName,id)
大家会发现: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
调用Demo.getByName(name)就可以直接得到一个Demo的数据对象,然后调用set、update等函数来使用了,并可以用data()来获取查询到的数据。
参考资料:
jxTMS设计思想
jxTMS编程手册
下面的系列文章讲述了如何用jxTMS开发一个实用的业务功能:
如何用jxTMS开发一个功能
下面的系列文章讲述了jxTMS的一些基本开发能力:
jxTMS的HelloWorld