软件之家 1

Flask学习笔记–数据库(Python3.6),flaskpython3.6

Python 数据库框架

  选取数据库框架的成分:

品种组织搭建

  application

  |____application    web目录

  |____manage.py    脚本数据

  |____runserver.py  运行服务器

  |  |______init__.py  模块导出文件

  |  |____app.conf      配置文件

  |  |____models.py    数据模型

  |  |____views.py    视图

  |  |____static    静态文件

  |  |____templates    页面模板

  |  |  |____base.html

  |  |  |____index.html

  |  |  |____login.html

 

1. Flask安装和框架(官方网站演示卡塔尔国 

  Flask官网:

  中文

  Flask安装:pip3 install Flask-SQLAlchemy

  PyMySQL:pip3 install Flask-PYMy

2. ORM介绍 

 

  对象关联映射(Object Relational Mapping,
ORM)是为减轻面向对象与关周全据仓库储存在的互不相称的技术,本质少校数据从意气风发种样式转变来另生机勃勃种方式;

  对象和关周到据是事情实体的二种表现格局,业务实体在内部存款和储蓄器中表现为对象,在数据库中表现为关全面据;

  内部存款和储蓄器中的指标时期存在涉嫌和后续关系,在数据库中关周全据无法直接表明多涉及和继续关系;

  对象-关系映射系统日常以中间件格局存在,首要实现程序对象到关周全据库数据的炫彩;

  在工作逻辑层和客户界面层中,皆以面向对象的,当目标音信发生变化,需把对象的新闻保存在关周到据库中。

软件之家 1

 

3. 数据库切换/开端化

3.1 使用U途达L连接数据库

数据库引擎 URL
MySQL mysql://username:[email protected]/database
Postgres postgresql://username:[email protected]/database
SQLite(Unix) sqlite:////absolute/path/to/database
SQLite(Windows) sqlite:///c:/absolute/path/to/database

  SQLite 数 据 库 不 需 要 使 用 服 务 器, 因 此 不 用 指 定 hostname
、 username 和 password 。ULacrosseL 中的 database 是硬盘上文件的文书名。 3.2
配置

1、SQLALCHEMY_DATABASE_UTiguanI  ——连接数据的数据库

  如:SQLALCHEMY_DATABASE_URI =
‘mysql://root:[email protected]:3306/test’;

2、SQLALCHEMY_ECHO

  若设为True,SQLAlchemy记录全部发送到规范输出的言语,对跳是有救助;

3、SQLALCHEMY_RECORD_QUEWranglerIES  ——显式地剥夺或启用查询记录

  查询记录在调节和测量试验或测量试验方式下自行启用;

4、SQLALCHEMY_NATIVE_UNICODE  ——显式地剥夺原生的unicode

5、SQLALCHEMY_TRACK_MODIFICATIONS

  若设为True,SQLAlchemy将跟踪对象的改正和发送非确定性信号;私下认可是None;

事例
:首先配置模块导出模块,导入SQLAlchemy扩充,再次创下制三个Flask应用,接着加载配置,然后成立SQLAlchemy对象,并将Flask应用作为参数字传送递

1 #__init__.py
2 
3 from flask import Flask
4 from flask_sqlalchemy import SQLAlchemy 
5 
6 app = Flask(__name__)
7 app.config.from_pyfile('app.conf')
8 
9 db = SQLAlchemy(app)

1 #app.conf
2 
3 SQLALCHEMY_DATABASE_URI = 'mysql://root:[email protected]:3306/test'
4 SQLALCHEMY_TRACK_MODIFICATIONS = True
5 SQLALCHEMY_ECHO = False
6 SQLALCHEMY_NATIVE_UNICODE = True
7 SQLALCHEMY_RECORD_QUERIES = False

3.3数据模型

  1. 前后相继中有成都百货上千类,数据库中有成都百货上千表,SQLAlchemy将类与表组成;

2.
db.Model点名所在类与数据库相关联,全部模型的基类是db.Model,存款和储蓄在必需创制的SQLAlchemy实例;

  1. 具备模型的定义都要延续db.Model类!

  2. 用Column定义一列,列名是赋值给那叁个变量的名号;

  3. 软件之家,列的项目是Column的第一个参数,可一向提供,平淡无奇类型如下:

类型名 Python类型 说 明
Integer int 普通整数,一般是 32 位
SmallInteger int 取值范围小的整数,一般是 16 位
BigInteger int 或 long 不限制精度的整数
Float float 浮点数
Numeric decimal.Decimal 定点数
String str 变长字符串
Text str 变长字符串,对较长或不限长度的字符串做了优化
Unicode unicode 变长 Unicode 字符串
UnicodeText unicode 变长 Unicode 字符串,对较长或不限长度的字符串做了优化
Boolean bool 布尔值
Date datetime.date 日期
Time datetime.time 时间
DateTime datetime.datetime 日期和时间
Interval datetime.timedelta 时间间隔
Enum str 一组字符串
PickleType 任何 Python 对象 自动使用 Pickle 序列化
LargeBinary str 二进制文件

最常使用的SQLAlchemy列选项

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

事关发挥

关系型数据库使用关系把差别表中的行关系起来。

1. 生机勃勃对多关系

  ”少年老成”的一方关系选取db.relationship(卡塔尔方法表示,第贰个参数是多的一方的类名的字符串方式,其余参数见下:

选项名 说 明
backref 在为建立双向连接,设置反向引用,在多的一方所在类上声明新的属性;
primaryjoin 明确指定两个模型之间使用的联结条件。只在模棱两可的关系中需要指定
lazy 指定如何加载相关记录。可选值有 select (首次访问时按需加载)、 immediate (源对象加载后就加载)、 joined (加载记录,但使用联结)、 subquery (立即加载,但使用子查询),noload (永不加载)和 dynamic (不加载记录,但提供加载记录的查询)
uselist 如果设为 Fales ,不使用列表,而使用标量值
order_by 指定关系中记录的排序方式
secondary 指定 多对多 关系中关系表的名字
secondaryjoin SQLAlchemy 无法自行决定时,指定多对多关系中的二级联结条件

  如贰个User具备三个Image,定义后生可畏对多涉及;

  因为设置backref参数,Image表(多)可拿到User表(风华正茂)的性质,如

 1 #models.py
 2 
 3 class User(db.Model):  
 4     id = db.Column(db.Integer, primary_key=True, autoincrement=True)  
 5     username = db.Column(db.String(80), unique=True)  
 6     password = db.Column(db.String(32))  
 7     head_url = db.Column(db.String(256))
 8     images = db.relationship('Image', backref = 'user', lazy = 'dynamic')
 9     
10 class Image(db.Model):  
11     id = db.Column(db.Integer, primary_key = True, autoincrement = True)  
12     url = db.Column(db.String(512))  
13     user_id = db.Column(db.Integer, db.ForeignKey('user.id'))  
14     created_date = db.Column(db.DateTime)  

2. 大器晚成对意气风发关联
  生机勃勃对黄金时代涉嫌得以用前边介绍的一对多关系表示,但调用 db.relationship(卡塔尔(قطر‎时要把 uselist 设为 False ,把“多”产生“风度翩翩”

3. 多对多涉及

  如博客中tag和日志的关系;

  定义用于关系的帮忙表,接济表不提出利用模型,选拔实际的表;

 1 tags = db.Table('tags',
 2     db.Column('tag_id', db.Integer, db.ForeignKey('tag.id')),
 3     db.Column('page_id', db.Integer, db.ForeignKey('page.id'))
 4 )
 5 
 6 class Page(db.Model):
 7     id = db.Column(db.Integer, primary_key=True)
 8     tags = db.relationship('Tag', secondary=tags, backref=db.backref('pages', lazy='dynamic'))
 9 
10 class Tag(db.Model):
11     id = db.Column(db.Integer, primary_key=True)

Flask学习笔记–数据库(Python3.6),flaskpython3.6

4. 数据库操作

  • 创建表

1 python manage.py shell
2 >>> from manage.py import db
3 >>> db.create_all()
  • 删除表

1 db.drop_all()
  • 插入行

  向数据库插入数据分三步:

  1  成立对象

  2 以参数格局传递,加多到会话

  3 提交会话(假如不交付,数据库不会变动)

  注意:这里的对话是SQLAlchemy会话;

1 user = User('Alice', '123456', 'http://images.***.com/head/1223/m.png') 
2 db.session.add(user) 
3 db.session.commit()
  • 删除行

  从数据库中除去数据分三步:

  1 查询数据

  2 从会话中去除

  3 提交会话

1 user = User.query.get(1)  
2 user.delete() # 删除方法1  
3 db.session.delete(user) # 删除方法2  
4 db.session.commit()  
  • 更新

  更新数据库中的数据分三步:

  1 询问数据

  2 更改数据

  3 提交会话

1 user = User.query.filter_by(id > 5)  
2 user.username = '[newname]' # 更新方法1  
3 user.update({'username' : '[newname]'}) # 更新方法2  
4 db.session.commit() 
  • 查询

  1 查询任何。Role.query.all(卡塔尔

  2
标准查询(使用过滤器)。User.query.filter_by(role=user_role).all()

  常用过滤器

过滤器 说 明
filter() 把过滤器添加到原查询上,返回一个新查询
filter_by() 把等值过滤器添加到原查询上,返回一个新查询
limit() 使用指定的值限制原查询返回的结果数量,返回一个新查询
offset() 偏移原查询返回的结果,返回一个新查询
order_by() 根据指定条件对原查询结果进行排序,返回一个新查询
group_by() 根据指定条件对原查询结果进行分组,返回一个新查询

     最常使用的SQLAlchemy查询施行函数

方 法 说 明
all() 以列表形式返回查询的所有结果
first() 返回查询的第一个结果,如果没有结果,则返回 None
first_or_404() 返回查询的第一个结果,如果没有结果,则终止请求,返回 404 错误响应
get() 返回指定主键对应的行,如果没有对应的行,则返回 None
get_or_404() 返回指定主键对应的行,如果没找到指定的主键,则终止请求,返回 404 错误响应
count() 返回查询结果的数量
paginate() 返回一个 Paginate 对象,它包含指定范围内的结果
  • 询问分类及例子

  1 简单询问

  query.all(卡塔尔国:重返list类型的全数数据

  2 带条件查询

  query.filter_by(name=’twc’).all()

  query.filter_by(id=5).first()

  query.filter(User.username.endswith(‘0’)).all()

  3 排序查询

  query.order_by(User.id.desc()).offset(1).limit(2).all()

  4 分组查询

  query.get(ident卡塔尔(英语:State of Qatar):基于主键的id属性,重回钦赐元组

  5 组合查询

  query.filter(and_(User.id > 57, User.id < 59)).all()

  query.filter(or_(User.id == 57, User.id == 59)).all()

  6 分页查询

  paginate(page=None, per_page=None,
error_out=True卡塔尔国再次来到pagination对象,第多少个参数表示当前页,第三个参数表示每页呈现的数量,error_out=True代表若拟定也尚无内容则报404谬误,不然再次来到空驶列车表;

  pagination对象常用方法如下:

    items:重返当前页的内容列表

    has_next:是或不是还也会有下风华正茂页

    has_prev:是不是还会有上大器晚成页

Flask学习笔记–数据库(Python3.6),flaskpython3.6。    next(error_out=False卡塔尔国:再次回到下意气风发页的Pagination对象

    prev(error_out=False卡塔尔(قطر‎:再次来到上后生可畏页的Pagination对象

    page:当前页的页码(从1开首)

    pages:总页数

    per_page:每页呈现的数额

    prev_num:上大器晚成页页码数

    next_num:下意气风发页页码数

    query:重临创造该Pagination对象的询问对象

    total:查询重返的笔录总量

 

Python 数据库框架 选拔数据库框架的因素: 项目布局搭建 application
|____application web目录 |___…

相关文章

发表评论