• ORM什么是?

    类名 ---> 数据库表

    对象 ---> 记录

    对象.属性 ---> 字段

      - ORM的优缺点:
    优点:
    可跨平台,可以通过对象.属性取值,对象.方法,让该方法内部执行SQL语句。比如:save --> insert into table... 缺点:
    1.执行效率低
    2.程序员随着年龄的增长,会遗忘原生SQL语句。

    2、MySQL连接类:

    import pymysql

    class MySQLClient():

    def init(self):

    # 1.连接数据库客户端

    self.client = pymysql.connect(

    host

    port

    user

    password

    database

    charset='utf8'

    autocommit=True

    )

              # 2.获取数据库游标
    self.cursor = self.client.cursor(
    pymysql.cursors.DictCursor
    ) # 查询方法
    def my_select(self, sql, value=None):
    # 1.提交sql语句
    self.cursor.execute(sql, value) # 2.获取数据库查询返回的结果
    res = self.cursor.fetchall() return res # 插入或更新方法sql提交
    def my_execute(self, sql, value): try:
    # 提交sql语句
    self.cursor.execute(sql, value) except Exception as e:
    print(e) def close(self):
    # 关闭游标
    self.cursor.close()
    # 关闭数据库连接
    self.client.close()

    3、ORM封装的查、增、改

    from mysql_py import MySQLClient


    @classmethod User.orm_select(name=tank)
    def orm_select(cls, **kwargs): # name=tank, age=18 ---> {name:tank, }
    mysql = MySQLClient()
    # 如果没有查询条件
    if not kwargs:
    # sql: select * from table_name;
    sql = 'select * from %s' % cls.table_name
    res = mysql.my_select(sql) # 如果有查询条件
    else:
    key = list(kwargs.keys())[0]
    value = kwargs.get(key)
    sql = 'select * from %s where %s=?' % (cls.table_name, key)
    sql = sql.replace('?', '%s')
    res = mysql.my_select(sql, value) # res ---> [{}, {}, {}] ------> [obj, obj. obj]
    # 将普通字典对象转为特殊字典对象---> 给普通字典对象添加了 对象.属性 取值/存值得方式。
    return [cls(**r) for r in res] # **{k:v, k2: v2} ---> k=v, k2=v2 增: insert into
    def orm_insert(self):
    mysql = MySQLClient()
    # sql: insert into table_name(f1, f2..) values(v1, v2..);
    key_list = []
    value_list = []
    args_list = [] for k, v in self.mappings.items():
    # k--》字段名
    # v--》字段对象
    if not v.primary_key:
    # 获取字段名
    key_list.append(v.name)
    # key_list.append(k) # 获取字段值
    value_list.append(
    # 通过反射获取字段的值: 反射可以通过字符串获取对象的属性值
    getattr(self, v.name, v.default) # 若v.name没有值,则使用默认值
    ) args_list.append('?') # 'insert into %s(%s) values(???)'
    sql = 'insert into %s(%s) values(%s)' % (
    self.table_name, ','.join(key_list),
    ','.join(args_list)
    ) sql = sql.replace('?', '%s')
    mysql.my_execute(sql, value_list) 改: update table_name set k=v, k2=v2 where id=pk_val;
    def orm_update(self):
    mysql = MySQLClient()
    key_list = []
    value_list = []
    primary_key = None for k, v in self.mappings.items():
    # 1.获取主键与主键对应的值
    if v.primary_key:
    primary_key = v.name + '=%s' % getattr(self, v.name) else:
    key_list.append(
    v.name + '=?'
    ) value_list.append(
    getattr(self, v.name)
    ) sql = 'update %s set %s where %s' % (
    self.table_name,
    ','.join(key_list),
    primary_key
    ) sql = sql.replace('?', '%s') mysql.my_execute(sql, value_list)

最新文章

  1. elk系列8之logstash+redis+es的架构来收集apache的日志
  2. [转]asp.net解决高并发的方案.
  3. Windows-006-映射网络驱动器图文详解
  4. linux命令(3):复制,剪切(文件和文件夹)
  5. HTML5上传图片预览
  6. ActiveMQ之Topic
  7. PHP获取IP地址所在的地理位置
  8. crontab 配置
  9. 0,null,empty,空,false,isset
  10. C注意,使用的语言字符串
  11. Linux常用命令说明(记录自己Linux命令使用情况,后续会持续更新)
  12. SuperSocket基础一
  13. DAY19、日常模块
  14. python正则匹配示例
  15. 洛谷P3957 跳房子(Noip2017普及组 T4)
  16. css详细笔记
  17. [UE4]基于物理的材质
  18. 基于Redis的CAS集群
  19. C#游戏开发中快速的游戏循环
  20. 20155302《网络对抗》Exp9 Web安全基础

热门文章

  1. InheritableThreadLocal详解
  2. MVC+Ninject+三层架构+代码生成 -- 总结(一、數據庫)
  3. SUSE12Sp3-使用Docker导入镜像并安装redis,zookeeper,kafka
  4. springboot整合docker部署
  5. rsync+inotify实现多台服务器之间数据实时同步
  6. Java自学-数字与字符串 字符串
  7. Nginx深入详解之upstream分配方式
  8. tomcat添加https服务
  9. mongoDB看这篇就够了
  10. Dijkstra算法求最短路径 Java实现