-
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)