flask 和django区别--在models设计和数据库方面

对于flask:

pip install flask_sqlalchemy(flask 一般用这个作为关系型数据库;他简化了sqlalchemy的操作)可以提供orm和原生的数据库操作;)

pip install pymysql

配置:

app.config['SQLALCHEMY_DATABASE_URI'] = 'mysql+pymysql://root:[email protected]:3306/database_name

这里需要注意的是'SQLALCHEMY_DATABASE_URI' 是不能变得;

还有一些关于数据操作上的配置:

1:app.config['SQLALCHEMY_COMMIT_ON_TEARDOWN'] = True(每次请求结束之后自动提交数据库中的改动)

2:app.config['SQLALCHEMY_TRACK_MODIFICATIONS'] = True

3:app.config['SQLALCHEMY_ECHO'] = True (查询时显示原始sql语句)

这里做个简单的小demo:

from flask import Flask

from flask_sqlalchemy import SQLAlchemy

app = Flask(__name__)

app.config['SQLALCHEMY_COMMIT_ON_TEARDOWN'] =True

app.config['SQLALCHEMY_TRACK_MODIFICATIONS'] =True

app.config['SQLALCHEMY_ECHO'] = True

db = SQLAlchemy(app)

#创建models(基于类的方式,flask_sqlalchemy 是ORM(objects-relationship-mapping))

class Roles(db.Models):

# 注意类都是要继承db.Models的

     __table_name ='roles'

     id = db.Columns(db.Interger,primary_key=True)

     name = db.Columns(db.String(64),unique=True)

    us = db.relationship('USER',backref='role')

     def __repr__(self):

#显示一个可读的字符串

            return self.name

class User(db.Model):
    __tablename__ = 'users'
    id = db.Column(db.Integer, primary_key=True)
    name = db.Column(db.String(64), unique=True, index=True)
    email = db.Column(db.String(64),unique=True)
    pswd = db.Column(db.String(64))
    role_id = db.Column(db.Integer, db.ForeignKey('roles.id'))

    def __repr__(self):
        return 'User:%s'%self.name

if __name__ == '__main__':

 db.drop_all()
    db.create_all()
    ro1 = Role(name='admin')
    ro2 = Role(name='user')
    db.session.add_all([ro1,ro2])
    db.session.commit()
    us1 = User(name='wang',email='[email protected]',pswd='123456',role_id=ro1.id)
    us2 = User(name='zhang',email='[email protected]',pswd='201512',role_id=ro2.id)
    us3 = User(name='chen',email='[email protected]',pswd='987654',role_id=ro2.id)
    us4 = User(name='zhou',email='[email protected]',pswd='456789',role_id=ro1.id)
    db.session.add_all([us1,us2,us3,us4])
    db.session.commit()
    app.run(debug=True)

关于django的数据库操作:

django已经自带ORM操作,不需要再装;

只需要装相应数据库的驱动即可

1:pip install pymysql

2:配置就在settings里面的DATABASE里面配置

注意都是大写,这些都是固定的;

这个时候可以运行一下,运行的时候他会自动去连接数据库,查看配置信息是否正确;

下面也同样写一个相同的demo:

与flask不同的是,django不是通过SQLAlchemy(app)生成的db

而是通过django内部的模块来导入的
from django.db import models

class Roles(models.Model):

id = models.AutoField() #这个通常不用指定,django会自动创建

name = models.CharField(max_length=20,verbose_name='姓名‘)

class User(models.Model):

id = models.AutoField()

name = models.Charfield(max_length=20)

email = models.EmailField()

password = models.CharField()

role_id = models.ForeignKey('BookInfo')

if __name__ == '__main__':

role1 = Roles()

role1.name='bluesli1'

role1.save()

role1 = Roles.object.get(id=1)

user1 = User()

user1.role_id = role1.id

user1.name='bluesli2'

user1.save()

这就大致完成了flask和django的简单的数据库操作:

接下来对比一下两者的区别:

1:在模块models的使用方面

flask是通过SQLAlchemy(app) 生成数据库models对象的

而django是通过模块导入的方式进行的:from django.db import models

2:models的创建都是基于类的方式;(ORM方式)

3:都是模型类都是继承各自的Model;

4:在字段创建的时候可以看出

flask对字段的类型说明是在db.Columns(db.String(64)(数据类型))是在内部参数中指明的;也就是说flask将字段类型和约束是当作方法的参数就行指定的;

django是:models.CharField(max_length=20),是通过相应的方法创建的,对应的约束在方法的参数里面

接下来说说一个关于外键的一个很大的区别:

flask中:

class Role...

__table_name='roles'

us = db.relationship('User',backref='roles') :这里需要注意User必须是-一对多关系中多方的类名,而roles可以任意指定,但是最好和类型关;

.......

class User....

__tablename__='user'

role_id = db.column(db.Integer,db.ForeigneKey('roles.id')注意此处roles必须是Roles的表名称;

而在django中:

role_id = db.ForeignKey('Roles') Roles必须是一对多关系中一方的类名;

下面再来说一下flask字段和django字段类型的区别

django:

Django根据属性的类型确定以下信息:

  • 当前选择的数据库支持字段的类型
  • 渲染管理表单时使用的默认html控件
  • 在管理站点最低限度的验证

django会为表创建自动增长的主键列,每个模型只能有一个主键列,如果使用选项设置某属性为主键列后django不会再创建自动增长的主键列。

默认创建的主键列属性为id,可以使用pk代替,pk全拼为primary key。

注意:pk是主键的别名,若主键名为id2,那么pk是id2的别名。

属性命名限制:

  • 不能是python的保留关键字。
  • 不允许使用连续的下划线,这是由django的查询方式决定的,在第4节会详细讲解查询。
  • 定义属性时需要指定字段类型,通过字段类型的参数指定选项,语法如下:
属性=models.字段类型(选项)

字段类型

使用时需要引入django.db.models包,字段类型如下:

  • AutoField:自动增长的IntegerField,通常不用指定,不指定时Django会自动创建属性名为id的自动增长属性。
  • BooleanField:布尔字段,值为True或False。
  • NullBooleanField:支持Null、True、False三种值。
  • CharField(max_length=字符长度):字符串。
    • 参数max_length表示最大字符个数。
  • TextField:大文本字段,一般超过4000个字符时使用。
  • IntegerField:整数。
  • DecimalField(max_digits=None, decimal_places=None):十进制浮点数。
    • 参数max_digits表示总位数。
    • 参数decimal_places表示小数位数。
  • FloatField:浮点数。
  • DateField[auto_now=False, auto_now_add=False]):日期。
    • 参数auto_now表示每次保存对象时,自动设置该字段为当前时间,用于"最后一次修改"的时间戳,它总是使用当前日期,默认为false。
    • 参数auto_now_add表示当对象第一次被创建时自动设置当前时间,用于创建的时间戳,它总是使用当前日期,默认为false。
    • 参数auto_now_add和auto_now是相互排斥的,组合将会发生错误。
  • TimeField:时间,参数同DateField。
  • DateTimeField:日期时间,参数同DateField。
  • FileField:上传文件字段。
  • ImageField:继承于FileField,对上传的内容进行校验,确保是有效的图片。这里需要注意Image也是字符,所以需要指定max_length;

选项

通过选项实现对字段的约束,选项如下:

  • null:如果为True,表示允许为空,默认值是False。
  • blank:如果为True,则该字段允许为空白,默认值是False。
  • 对比:null是数据库范畴的概念,blank是表单验证范畴的
  • db_column:字段的名称,如果未指定,则使用属性的名称。
  • db_index:若值为True, 则在表中会为此字段创建索引,默认值是False。
  • default:默认值。
  • primary_key:若为True,则该字段会成为模型的主键字段,默认值是False,一般作为AutoField的选项使用。
  • unique:如果为True, 这个字段在表中必须有唯一值,默认值是False。

Flask:

常用的SQLAlchemy字段类型

类型名 python中类型 说明
Integer int 普通整数,一般是32位
SmallInteger int 取值范围小的整数,一般是16位
BigInteger int或long 不限制精度的整数
Float float 浮点数
Numeric decimal.Decimal 普通整数,一般是32位
String str 变长字符串
Text str 变长字符串,对较长或不限长度的字符串做了优化
Unicode unicode 变长Unicode字符串
UnicodeText unicode 变长Unicode字符串,对较长或不限长度的字符串做了优化
Boolean bool 布尔值
Date datetime.date 时间
Time datetime.datetime 日期和时间
LargeBinary str 二进制文件

常用的SQLAlchemy列选项

选项名 说明
primary_key 如果为True,代表表的主键
unique 如果为True,代表这列不允许出现重复的值
index 如果为True,为这列创建索引,提高查询效率
nullable 如果为True,允许有空值,如果为False,不允许有空值
default 为这列定义默认值

常用的SQLAlchemy关系选项

选项名 说明
backref 在关系的另一模型中添加反向引用
primary join 明确指定两个模型之间使用的联结条件
uselist 如果为False,不使用列表,而使用标量值
order_by 指定关系中记录的排序方式
secondary 指定多对多中记录的排序方式
secondary join 在SQLAlchemy中无法自行决定时,指定多对多关系中的二级联结条件

对比flask和django:

flask:nullable

django:null

flask:index

django:db_index

还有一个是关于字符串输出问题的:

flask:

def __repr__(self):

django:

def __str__(self):python3

def __unicode__(self):python2

还有就是flask对于边长的字段类型:String(64)这个有点类似sql字段指定的方式

而django:models.CharField(max_length=20):通过选项max_length指定

 

猜你喜欢

转载自blog.csdn.net/weixin_38859557/article/details/83785785
今日推荐