一个MySQL注解操作方式

AQuer的Python项目详细描述


AQuery 一个注解方式操作数据库的便捷库

安装

pip install AQuery

1、IQuery负责数据查询操作

不同的操作仅代表不同类型的返回值,参数都是一样 也更加语义化

     操作          | 装饰器方式   | data参数    |       返回值
===========================================================
query_insert      | insert      | dict       | lastrowid {int}
query_insert_many | insert_many | list[dict] | rowcount {int}
query_select      | select      | dict       | fetchall {list[dict]}
query_select_one  | select_one  | dict       | fetchone {dict}
query_update      | update      | dict       | rowcount {int}
query_delete      | delete      | dict       | rowcount {int}

2、关键字使用
#{key}  变量参数 预编译为 %(key)s
${key}  原样替换 ${key} -> value, 如果携带的data中不存在,会尝试从 class_object 参数中获取
@{key}  自动参数 已实现特殊参数:fields,values, data
({key}) 列表参数  ({key}) -> (1, 2, 3)

参考 https://www.bbsmax.com/A/n2d9P9gY5D/

4、kwargs 参数
    class_object  传递一个类对象,用于从类中获取原样数据
    ignore_errors 执行SQL 时忽略的异常

5、函数方式查询
当使用query_* 查询是,第一个参数sql,第二个参数data是dict类型

6、装饰器方式查询
当使用装饰器方式时,sql通过装饰器传递,而data通过被装饰的函数返回值传递,
如果函数没有返回值,则取被装饰函数的第一个参数,或取全部关键字参数

应用场景:
    1、如果函数传入一个dict 或list,不需要携带额外参数,可以简写

    @query.select("insert into student(name, age) values (#{name}, #{age})")
    def insert(data):
        pass

    insert({'name': "Tom", 'age': 23})

    2、如果需要有原样替换的字符串,需要data 返回
    @query.select("insert into student ${field} values ${value}")
    def insert(data):
        data.update({
            'field': '(name, age)',
            'value': '(#{name}, #{age})'
        })
        return data

    insert({'name': "Tom", 'age': 23})

Demo

# -*- coding: utf-8 -*-importmysqlfromaquery.queryimportQueryclassMysqlQuery(Query):DATABASE_CONFIG={"database":"data","user":"root","password":"aBc@123456","host":"127.0.0.1","port":3306,"autocommit":True,"pool_name":"mypool",# 使用连接池"pool_size":1,}# 忽略的异常IGNORE_ERRORS=(mysql.connector.errors.IntegrityError,)# mysql-connector-python 连接操作mysql# http://www.zhangdongshengtech.com/article-detials/269# 装饰器方式使用# 函数参数默认为data, 数据类型是一个dict,或者是None# 当使用insert_many时 也可以是一个list@MysqlQuery.select("select * from student where name=#{name}")defget_student_by_name(name):pass# print(get_student_by_name(name="Tom"))# 可以自定义函数参数,不过需要返回一个dict 类型的数据,传递给sql 执行器@MysqlQuery.select("select * from student where id=#{uid}")defget_student_by_id(uid):pass# print(get_student_by_id(uid=12))# 可以自定义函数参数,不过需要返回一个dict 类型的数据,传递给sql 执行器@MysqlQuery.select("select * from student where id in ({uids})")defget_student_by_ids(uids):pass# print(get_student_by_ids(uids=[13, 23, 33]))@MysqlQuery.insert("insert into student @{fields} values @{values}")definsert_student(data):pass# data = {"name": "Tom", 'age': 23}# print(insert_student(data))@MysqlQuery.update("update student set @{data} where id = #{uid}")defupdate_student(uid,name):pass# print(update_student(uid=12, name=12))@MysqlQuery.delete("delete from student where id = #{uid}")defdelete_student(uid):pass# print(delete_student(uid=12))if__name__=='__main__':sql="select * from student limit 10"# print(MysqlQuery.query(sql))sql2="INSERT INTO student @{fields} VALUES @{values}"MysqlQuery.query_insert_many(sql2,[{"name":"Tom","age":12},{"name":"Tom","age":12}])
# -*- coding: utf-8 -*-fromdemo.query_demoimportMysqlQueryfromaquery.query_modelimportIQueryModelclassBaseQueryModel(IQueryModel):query=MysqlQueryclassStudentModel(BaseQueryModel):table="student"select_fields="name, age"@classmethod@MysqlQuery.select('select ${select_fields} from ${table} where name = #{name}')defselect_by_name(cls,name):passif__name__=='__main__':pass# print(StudentModel.insert_many([{"name": "Tom", "age": 12}]))# print(StudentModel.insert({"name": "Tom", "age": 12}))# print(StudentModel.select_by_id(27))# print(StudentModel.delete_by_id(27))# print(StudentModel.select_by_ids([27, 25]))# print(StudentModel.update_by_id(27, {'id': 26, "name": "--T'om", "age": 13}))print(StudentModel.select_by_name(name='Jack'))

欢迎加入QQ群-->: 979659372 Python中文网_新手群

推荐PyPI第三方库


热门话题
我们应该在测试java代码时模拟黄瓜测试吗。我们应该在多大程度上使用黄瓜?   Hibernate Weblogic 10.3.4 java。lang.NoSuchMethodError:javax/persistence/spi/PersistenceUnitInfo。getValidationMode()Ljavax/persistence/ValidationMode;   java如何在main()中访问私有静态实例变量   java JMockit无法模拟类的公共final字段   java是否可以返回特定控制器操作的输出(html)?   java如何返回正确类型的列表?   rest-OpenUI/Swagger-java-to-API   java组织。springframework。豆。工厂NoSuchBeanDefinitionException或加载ApplicationContext失败   java使用POST将参数从JSP发送到Servlet   java如何监听特定的按钮按下和主视图用户交互?   java如何让gradle在本地maven repo中覆盖库?   如何在Java中“合并”两个URI?   java如何制作一个方法来移动数组中的字符?   使用来自java的命令启动powershell窗口   java垃圾收集器和匿名类   java如何为CellTable(GWT 2.4)中的ImageResourceCell创建PanelPopup?