ORM之youku项目小练习(上)

什么是ORM

问题

如果我们具体操作数据库的时候,是不是很麻烦,每次都要和复杂的SQL语句打交道?

解决

Object-Relationl Mapping,作用就是关系型数据库和对象之间的一个映射,

这样子我们只需要像平时操作对象一样操作它就可以了.极大的增大了开发效率

缺点

sql封装固定,不利于SQL查询优化

具体的东西就不一一展示了,具体请看我转发的一篇

[ 文章]   https://www.cnblogs.com/jhpy/articles/11611468.html 

ORM对象关系映射

关系映射

'''MySQL:                python:
  表名     ---->       类名
  一条记录   --->       对象
  字段       --->       对象.属性'''

关系分析

上面关系分析:
通过python中创建类来实现对数据库一张表结构的关系产生一种一一对应关系
通过python中对创建的类实例化的对象操作对数据库一张表进行表记录的操作的一一对应关系
通过python中对象点属性的方式来操作记录表中某一字段的对应值,的一一对应操作关系

步骤

首先它围绕着这MySQL做的

创建一张User表,表内含有字段(id,name,pwd),

class User:
   def __init__(self,id,name,pwd):
       self.id=id
       self.name=name
       self.pwd=pwd

问题1 表内是有字段类型的

但是我们的表内是有字段类型的,所以应该先写字段类型类,仿优酷系统只需要两种类,一种是int,另一种是varchar

  1. 写字段类型类

  • 字段名

  • 字段类型(长度)

    • -varchar(64)

    • int

  • 是否为主键

  • 默认值

先写int类

#需要先给字段3个默认值column_type,primary_key,default
class IntegerField:
   def __init__(self,name,column_type='int',primary_key=False,default=None):
       self.name=name
       self.column_type=column_type
       self.primary_key=primary_key
       self.default=default

写完int.类再写string varchar()类 是不是觉得有点复杂了,

问题2,如果多一点的类型怎么办?

  • 解决:

    • 继承一个Models父类.

#父类
class Field:
   def __init__(self,name,column_type,primary_key,default):
       self.name=name
       self.column_type=column_type
       self.primary_key=primary_key
       self.default=default

#两个字段类型类
#整型
class IntegerField:
   def __init__(self,name,column_type='int',primary_key=False,default=None):
       super().__init__(name,column_type,primary_key,default)
#字符串
class StringField:
   def __init__(self,name,column_type='varchar(64)',primary_key=False,default=None):
       super().__init__(name,column_type,primary_key,default)

仿优酷可以干些什么?

看电影,那么有个电影表类,还有公告表....

'''写表类
  User:
      user_name
      pwd

  Movie:
      movie_name
      movie_size

  Notice:
      title
      content'''

问题3.假设100张表就需要写100个__init__

  • 解决那么我们就写在一个父类里面 继承一个Models父类

但是又有问题了,即使我们想写父类也有限制,问题如下:

问题4:每张表的字段名与字段数量不同,导致没法直接继承Models父类

  • 解决:

    • dict是对象,继承dict,触发字典内部的__init__(因为它具备可接受任意数量以及任意类型属性的特性),

    验证:

原理解析:

dict是对象,(Python中一切皆为对象) 可以用来传任意关键字参数**kwargs ,形参中的**会将溢出的关键字实参全部接收,然后存储字典的形式,然后把字典赋值给**。key:value形式,可 自行查看源码

解决问题的方法总比 问题多,,

问题4 字典的取/存值方式有限,希望改为 对象.属性取值, 对象.属性=值 存值的方式。

猜你喜欢

转载自www.cnblogs.com/jhpy/p/11614601.html