python 用元类 type 实现对数据库的ORM 映射
生活随笔
收集整理的這篇文章主要介紹了
python 用元类 type 实现对数据库的ORM 映射
小編覺得挺不錯(cuò)的,現(xiàn)在分享給大家,幫大家做個(gè)參考.
python 實(shí)現(xiàn)對數(shù)據(jù)庫的ORM 映射
如果使用pymysql 操作數(shù)據(jù)庫 不借助框架的話,頻繁寫sql語句, 的確比較麻煩
這里借助 type 元類 對 數(shù)據(jù)表類實(shí)現(xiàn)了 與mysql之間的 映射
直接上代碼
import pymysqldef conn_database_execute(sql_str):conn = pymysql.connect(host='localhost', port=3306, user='root', password='123', database='it_test',charset='utf8')cus = conn.cursor()get_exist_tables = 'show tables;'cus.execute(get_exist_tables)ret = cus.fetchall()print(ret)if sql_str.startswith('create'):sql_str_list = sql_str.split(' ')print(sql_str_list)table_name = sql_str_list[2]if not (table_name,) in ret:print(' create a table ')cus.execute(sql_str)else:cus.execute(sql_str)print('===============================')print(sql_str)print('===============================')cus.close()conn.close()class MetaClassModel(type):def __new__(cls, cls_name, args, kwargs):mapping = dict()field_name_explain = dict()for k, v in kwargs.items():if isinstance(v, tuple):mapping[k] = vfield_name_explain[ v[0] ] = v[1]for k in mapping.keys():kwargs.pop(k)kwargs['mapping_'] = mapping# mapping_ = {# user_id = ('user_id', 'int unsigned auto_increment primary key not null'),# name = ('name', 'varchar(20)')# age = ('age', 'int unsigned')# }kwargs['table_'] = cls_nameif cls_name != 'Model':sql_str_1 = ''for field_name, field_explain in field_name_explain.items():print(type(field_name))print(type(field_explain))sql_str_1 += field_name + ' ' + field_explain +','sql_str_1 = sql_str_1[:-1]create_sql_str = "create table %s (%s);" %(cls_name, sql_str_1)print(create_sql_str)conn_database_execute(create_sql_str)return type.__new__(cls, cls_name, args, kwargs)class Model(metaclass=MetaClassModel):def __init__(self, **kwargs):for name, value in kwargs.items():setattr(self, name, value)def save(self):files = []args = []for key, vaule in self.mapping_.items():files.append(vaule[0])# 獲取通過(構(gòu)造方法 里面 setattr設(shè)置的參數(shù)value)args.append(getattr(self, key, None))args_temp = list()for temp in args:if isinstance(temp, int):args_temp.append(str(temp))elif isinstance(temp, str):args_temp.append("""'%s'"""%temp)sql_str = 'insert into %s (%s) values (%s);'%(self.table_, ','.join(files), ','.join(args_temp))print(sql_str)conn_database_execute(sql_str)class User(Model):user_id = ('user_id', 'int unsigned auto_increment primary key not null')name = ('name', 'varchar(20)')age = ('age', 'int unsigned')# mapping_ = {# user_id = ('user_id', 'int unsigned auto_increment primary key not null'),# name = ('name', 'varchar(20)')# age = ('age', 'int unsigned')# }# user_1 = User(user_id=0, name='WangMing', age=6) # user_1.save() # user_2 = User(user_id=0, name='LiQiang', age=7) # user_2.save() class SuperUser(Model):user_id = ('user_id', 'int unsigned auto_increment primary key not null')name = ('name', 'varchar(20)')age = ('age', 'int unsigned')user_2 = User(user_id=0, name='MengTing', age=7) user_2.save()只要定義一個(gè)類繼承 Model類, 就可以在數(shù)據(jù)庫中創(chuàng)建相應(yīng)的表,
但是還有個(gè)問題user.save() 明明生成了正確的sql語句, 卻沒有成功插入,不知道怎么回事, 希望路過的大哥告訴我一下,小弟不勝感激!
總結(jié)
以上是生活随笔為你收集整理的python 用元类 type 实现对数据库的ORM 映射的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 如何自测输卵管堵塞
- 下一篇: 江南百景图回馈盛宴在什么地方