对于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指定