ORM重要Django的核心思想
2018-03-18 10:31
507 查看
ORM是什么
ORM 是 python编程语言后端web框架 Django的核心思想,“Object Relational Mapping”,即对象-关系映射,简称ORM。
一个句话理解就是:创建一个实例对象,用创建它的类名当做数据表名,用创建它的类属性对应数据表的字段,当对这个实例对象操作时,能够对应MySQL语句
说明
所谓的ORM就是让开发者在操作数据库的时候,能够像操作对象时通过xxxx.属性=yyyy一样简单,这是开发ORM的初衷
只不过ORM的实现较为复杂,Django中已经实现了 很复杂的操作, 主要通过完成一个 insert相类似的ORM,理解其中的道理就就可以了
通过元类简单实现ORM中的insert功能
执行的效果:
完善对数据类型的检测
class ModelMetaclass(type):
def new(cls, name, bases, attrs):
mappings = dict()
# 判断是否需要保存
for k, v in attrs.items():
# 判断是否是指定的StringField或者IntegerField的实例对象
if isinstance(v, tuple):
print(‘Found mapping: %s ==> %s’ % (k, v))
mappings[k] = v
class User(metaclass=ModelMetaclass):
uid = (‘uid’, “int unsigned”)
name = (‘username’, “varchar(30)”)
email = (‘email’, “varchar(30)”)
password = (‘password’, “varchar(30)”)
# 当指定元类之后,以上的类属性将不在类中,而是在mappings属性指定的字典中存储
# 以上User类中有
# mappings = {
# “uid”: (‘uid’, “int unsigned”)
# “name”: (‘username’, “varchar(30)”)
# “email”: (‘email’, “varchar(30)”)
# “password”: (‘password’, “varchar(30)”)
# }
# table = “User”
def init(self, **kwargs):
for name, value in kwargs.items():
setattr(self, name, value)
u = User(uid=12345, name=’Michael’, email=’test@orm.org’, password=’my-pwd’)
运行效果如下:
Found mapping: uid ==> (‘uid’, ‘int unsigned’)
Found mapping: password ==> (‘password’, ‘varchar(30)’)
Found mapping: name ==> (‘username’, ‘varchar(30)’)
Found mapping: email ==> (‘email’, ‘varchar(30)’)
SQL: insert into User (email,uid,password,username) values (‘test@orm.org’,12345,’my-pwd’,’Michael’)
4. 抽取到基类中
class ModelMetaclass(type):
def new(cls, name, bases, attrs):
mappings = dict()
# 判断是否需要保存
for k, v in attrs.items():
# 判断是否是指定的StringField或者IntegerField的实例对象
if isinstance(v, tuple):
print(‘Found mapping: %s ==> %s’ % (k, v))
mappings[k] = v
class Model(object, metaclass=ModelMetaclass):
def init(self, **kwargs):
for name, value in kwargs.items():
setattr(self, name, value)
class User(Model):
uid = (‘uid’, “int unsigned”)
name = (‘username’, “varchar(30)”)
email = (‘email’, “varchar(30)”)
password = (‘password’, “varchar(30)”)
u = User(uid=12345, name=’Michael’, email=’test@orm.org’, password=’my-pwd’)
ORM 是 python编程语言后端web框架 Django的核心思想,“Object Relational Mapping”,即对象-关系映射,简称ORM。
一个句话理解就是:创建一个实例对象,用创建它的类名当做数据表名,用创建它的类属性对应数据表的字段,当对这个实例对象操作时,能够对应MySQL语句
说明
所谓的ORM就是让开发者在操作数据库的时候,能够像操作对象时通过xxxx.属性=yyyy一样简单,这是开发ORM的初衷
只不过ORM的实现较为复杂,Django中已经实现了 很复杂的操作, 主要通过完成一个 insert相类似的ORM,理解其中的道理就就可以了
通过元类简单实现ORM中的insert功能
执行的效果:
完善对数据类型的检测
class ModelMetaclass(type):
def new(cls, name, bases, attrs):
mappings = dict()
# 判断是否需要保存
for k, v in attrs.items():
# 判断是否是指定的StringField或者IntegerField的实例对象
if isinstance(v, tuple):
print(‘Found mapping: %s ==> %s’ % (k, v))
mappings[k] = v
# 删除这些已经在字典中存储的属性 for k in mappings.keys(): attrs.pop(k) # 将之前的uid/name/email/password以及对应的对象引用、类名字 attrs['__mappings__'] = mappings # 保存属性和列的映射关系 attrs['__table__'] = name # 假设表名和类名一致 return type.__new__(cls, name, bases, attrs)
class User(metaclass=ModelMetaclass):
uid = (‘uid’, “int unsigned”)
name = (‘username’, “varchar(30)”)
email = (‘email’, “varchar(30)”)
password = (‘password’, “varchar(30)”)
# 当指定元类之后,以上的类属性将不在类中,而是在mappings属性指定的字典中存储
# 以上User类中有
# mappings = {
# “uid”: (‘uid’, “int unsigned”)
# “name”: (‘username’, “varchar(30)”)
# “email”: (‘email’, “varchar(30)”)
# “password”: (‘password’, “varchar(30)”)
# }
# table = “User”
def init(self, **kwargs):
for name, value in kwargs.items():
setattr(self, name, value)
def save(self): fields = [] args = [] for k, v in self.__mappings__.items(): fields.append(v[0]) args.append(getattr(self, k, 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 = 'insert into %s (%s) values (%s)' % (self.__table__, ','.join(fields), ','.join(args_temp)) print('SQL: %s' % sql)
u = User(uid=12345, name=’Michael’, email=’test@orm.org’, password=’my-pwd’)
print(u.dict)
u.save()运行效果如下:
Found mapping: uid ==> (‘uid’, ‘int unsigned’)
Found mapping: password ==> (‘password’, ‘varchar(30)’)
Found mapping: name ==> (‘username’, ‘varchar(30)’)
Found mapping: email ==> (‘email’, ‘varchar(30)’)
SQL: insert into User (email,uid,password,username) values (‘test@orm.org’,12345,’my-pwd’,’Michael’)
4. 抽取到基类中
class ModelMetaclass(type):
def new(cls, name, bases, attrs):
mappings = dict()
# 判断是否需要保存
for k, v in attrs.items():
# 判断是否是指定的StringField或者IntegerField的实例对象
if isinstance(v, tuple):
print(‘Found mapping: %s ==> %s’ % (k, v))
mappings[k] = v
# 删除这些已经在字典中存储的属性 for k in mappings.keys(): attrs.pop(k) # 将之前的uid/name/email/password以及对应的对象引用、类名字 attrs['__mappings__'] = mappings # 保存属性和列的映射关系 attrs['__table__'] = name # 假设表名和类名一致 return type.__new__(cls, name, bases, attrs)
class Model(object, metaclass=ModelMetaclass):
def init(self, **kwargs):
for name, value in kwargs.items():
setattr(self, name, value)
def save(self): fields = [] args = [] for k, v in self.__mappings__.items(): fields.append(v[0]) args.append(getattr(self, k, 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 = 'insert into %s (%s) values (%s)' % (self.__table__, ','.join(fields), ','.join(args_temp)) print('SQL: %s' % sql)
class User(Model):
uid = (‘uid’, “int unsigned”)
name = (‘username’, “varchar(30)”)
email = (‘email’, “varchar(30)”)
password = (‘password’, “varchar(30)”)
u = User(uid=12345, name=’Michael’, email=’test@orm.org’, password=’my-pwd’)
print(u.dict)
u.save()相关文章推荐
- Hibernate核心思想—ORM机制(一)
- Hibernate核心思想—ORM机制(二)
- Hibernate核心思想—ORM机制(三)
- hibernate核心思想-------------ORM思想
- Hibernate核心思想—ORM机制
- Hibernate核心思想—ORM机制(三)
- 10位管理学大师及其核心重要思想
- Hibernate核心思想—ORM机制(一)
- 重要核心思想
- Hibernate核心思想—ORM机制(一)
- Hibernate核心思想—ORM机制(二)
- web.py中实现类似Django中的ORM的查询效果
- 二分图最大匹配问题与匈牙利算法的核心思想
- Django: show/log ORM sql calls from python shell - Stack Overflow
- 记忆术的核心原理和重要操作程序
- 【HDU5545 2015 CCPC 南阳国赛F】【差分约束思想 费用流思想】The Battle of Guandu 官渡之战 重要战场人数多 士兵流向转化问题为最短路spfa+dijkstra双写
- 仿基因编程的核心思想。为了大家阅读方便,把仿基因的核心概括一下
- Spring学习笔记一(Spring核心思想)
- 二叉树的遍历思想及核心代码实现
- Django - ORM操作