Django与Flask在数据库模型的区别

Django

重写元类可以自由控制创建类的过程,比如使用元类创建单例模式或ORM框架,Django的ORM框架实现原理是通过元类实现的。
他是code_first,由模型类生成数据表
先要编写模型字段的基本类,然后根据基本类继承再来编写一些字符类型,整数类型,然后再重新编写个模型类的元例(重写类的__new__方法,然后写个单例模式);
然后定义Model类,使用super().init() # 显示调用元类,然后在创建个save()方法。

# 模型字段的基本类
class Field(object):
    def __init__(self, name, column_type):
        self.name = name
        self.column_type = column_type
    def __str__(self):
        return '<%s:%s>' % (self.__class__.__name__, self.name) # 获取类名,实例变量

# 模型字段的字符类型
class StringField(Field):
    def __init__(self, name):
        super().__init__(name, 'varchar(100)')# 显示调用父类方法,写入列类型是varchar(100)

# 模型字段的整数类型
class IntegerField(Field):
    def __init__(self, name):
        super().__init__(name, 'bigint')

# 定义元类ModelMetaclass,控制Model对象的创建
class ModelMetaclass(type): # 继承元类,并重写元类type的__new__方法
    def __new__(cls, name, bases, attrs): # cls是类本身,attrs是一个字典,放有属性和方法
        mappings = dict()
        for k, v in attrs.items():
            # 保存类属性和列的映射关系到mappings字典
            if isinstance(v, Field):
                print('Found mapping: %s==>%s' % (k, v)) # 先执行这个元类
                mappings[k] = v
        for k in mappings.keys():
            # 将类属性移除,使定义的类字段不污染User类属性
            attrs.pop(k)
        # 假设表名和为类名的小写,创建类时添加一个__table__类属性
        attrs['__table__'] = name.lower() # 类名或表名全部变成小写
        # 保存属性和列的映射关系,创建类时添加一个__mappings__类属性
        attrs['__mappings__'] = mappings
        return super().__new__(cls, name, bases, attrs)

# 定义Model类
class Model(metaclass=ModelMetaclass):
    def __init__(self, *args, **kwargs): # 键值对参数调用了,位置参数并没有调用
        self.kwargs = kwargs
        super().__init__() # 显示调用元类

    def save(self):
        fields, params = [], []
        for k, v in self.__mappings__.items():
            fields.append(v.name)
            params.append(str(self.kwargs[k]))
        sql = 'insert into %s (%s) values (%s)' #
        sql = sql % (self.__table__, ','.join(fields), ','.join(params))
        print('SQL: %s' % sql)


# 定义模型User
class User(Model):
    # 定义类的属性到列的映射:
    id = IntegerField('Id') # 把他们的属性提取到列v.name中
    name = StringField('username')
    email = StringField('email')
    password = StringField('password')

# 创建实例对象
u = User(id=123, name='Dj', email='Dj@dd.gg', password='111') # 实例化并生成相应的SQL语句
# 调用save()方法;模型类save()的方法
u.save() # 只要在ORM框架里实现数据库连接,并执行SQL语句即可实现数据库的操作

Flask

Flask并没有自带的ORM,所以他有个插件,叫flask_sqlalchemy。在该插件下也可以制作一个类似于ORM的框架。
具体流程:
文件目录:只有__init__.py文件夹在应用文件夹下,其他的文件都在项目根目录下(一共4个文件)
一:配置好 config.py 文件(项目根目录与run.py同级)
二:在app应用下init.py文件下初始化数据(主要是初始化flask实例,SQLAlchemy类的实例化)
3.在项目根目录下建立一个 db_migrate.py文件
4.创建run.py文件启动,导入项目的实例app,采用app.run()启动

posted @ 2022-04-30 19:14  索匣  阅读(38)  评论(0编辑  收藏  举报