SQLAlchemy介绍
相关链接:
https://blog.csdn.net/zd0303/article/details/50470162
https://blog.csdn.net/abcd1f2/article/details/51395561
https://www.jb51.net/article/49789.htm
Flask-SQLAlchemy安装及设置
- SQLALchemy 实际上是对数据库的抽象,让开发者不用直接和 SQL 语句打交道,而是通过 Python 对象来操作数据库,在舍弃一些性能开销的同时,换来的是开发效率的较大提升
- SQLAlchemy是一个关系型数据库框架,它提供了高层的 ORM 和底层的原生数据库的操作。flask-sqlalchemy 是一个简化了 SQLAlchemy 操作的flask扩展。
- 文档地址:http://docs.jinkan.org/docs/flask-sqlalchemy
安装
- 安装 flask-sqlalchemy
pip install flask-sqlalchemy
- 如果连接的是 mysql 数据库,需要安装 mysqldb 驱动
pip install flask-mysqldb
数据库连接设置
- 在 Flask-SQLAlchemy 中,数据库使用URL指定,而且程序使用的数据库必须保存到Flask配置对象的 SQLALCHEMY_DATABASE_URI 键中
app.config['SQLALCHEMY_DATABASE_URI'] = 'mysql://账户名:密码@127.0.0.1:3306/test'
- 其他设置:
# 动态追踪修改设置,如未设置只会提示警告
app.config['SQLALCHEMY_TRACK_MODIFICATIONS'] = True
#查询时会显示原始SQL语句
app.config['SQLALCHEMY_ECHO'] = True
- 配置完成需要去 MySQL 中创建项目所使用的数据库
$ mysql -uroot -pmysql
$ create database test charset utf8;
- 其他配置
连接其他数据库
完整连接 URI 列表请跳转到 SQLAlchemy 下面的文档 (Supported Databases) 。这里给出一些 常见的连接字符串。
- Postgres:
postgresql://scott:tiger@localhost/mydatabase
- MySQL:
mysql://scott:tiger@localhost/mydatabase
- Oracle:
- oracle://scott:tiger@127.0.0.1:1521/sidname
- SQLite (注意开头的四个斜线):
sqlite:////absolute/path/to/foo.db
常用的SQLAlchemy字段类型
常用的SQLAlchemy列选项
常用的SQLAlchemy关系选项
数据库基本操作
-
在Flask-SQLAlchemy中,插入、修改、删除操作,均由数据库会话管理。
- 会话用 db.session 表示。在准备把数据写入数据库前,要先将数据添加到会话中然后调用 commit() 方法提交会话。
-
在 Flask-SQLAlchemy 中,查询操作是通过 query 对象操作数据。
- 最基本的查询是返回表中所有数据,可以通过过滤器进行更精确的数据库查询
1 """ 2 SQLAlchemy是flask的扩展,不是原生自带的 3 必须配置信息: 4 1.app.config['SQLALCHEMY_DATABASE_URI'] = 'mysql://root:mysql@127.0.0.1:3306/test' 5 2.# 动态追踪修改设置,如未设置只会提示警告 6 app.config['SQLALCHEMY_TRACK_MODIFICATIONS'] = True 7 8 其他的配置可以自己配,也可以不配值 9 SQLite是手机等移动终端的数据库 10 耦合度很低 11 """ 12 """ 13 1.设置配置文件: 14 2.创建数据库对象db = SQLAlchemy(app): 15 3.创建模型类class Book(db.Model): 16 4.创建表db.create_all(): 17 """ 18 from flask import Flask 19 from flask_sqlalchemy import SQLAlchemy # 导入数据库 20 21 app = Flask(__name__) 22 23 24 # 1.>设置配置文件 25 class Config: 26 # 记住:直接从源码里面拷贝,千万不要手写,很难记 27 # 设置数据库里面的主机ip,port名字,密码,数据库名 28 # test20:你创建的数据库名字 29 # password:你自己设置的登录密码 30 # root:你的用户名 这一项必须设置 31 SQLALCHEMY_DATABASE_URI = 'mysql://root:password@localhost:3306/test20' 32 # 动态追踪修改设置,如未设置只会提示警告,不会报错.这一项必须设置 33 app.config['SQLALCHEMY_TRACK_MODIFICATIONS'] = False 34 # 打印原始的SQL语句,这一项可以不设置 35 # app.config['SQLALCHEMY_ECHO'] = True 36 37 38 # flask的app对象和数据库进行绑定 39 app.config.from_object(Config) 40 41 # create database test20 charset utf8; 创建数据库,记得设置编码方式 42 # show create table books; 查看创建过程 43 44 # 创建数据库对象 45 # SQLAlchemy(app)语法,类创建一个数据库对象,db是名字,可以随意取 46 # 2.>创建数据库对象.注意:需要放到加载配置文件之后, 务必在app.config.from_object(Config)的后面 47 db = SQLAlchemy(app) 48 49 50 # 建立表,和当前的数据库进行关联 51 # 创建数据库的模型类,db.Model:语法,表示和当前的数据库进行关联 52 # 3.>创建模型类<只是设置表结构> 53 class Book(db.Model): 54 """设置表结构""" 55 # 创建表的名字,表的名字可以不设置,因为系统会给一个默认的表名,就是和类的名字一样,只不过是小写字符.但是建议自己设置 56 __tablename__ = 'books' 57 # db.Column:注意是C大写 58 # 创建列id字段,设置成主键 59 # 注意:在这里必须设置主键,否则无法进行Book类和books表名之间的关联映射. 60 id = db.Column(db.Integer, primary_key=True) 61 # 设置书的名字 62 name = db.Column(db.String(128)) 63 # 作者 64 author_name = db.Column(db.String(128)) 65 66 67 if __name__ == '__main__': 68 # 删除表 69 db.drop_all() 70 # 创建数据库中的表 71 # 4.>创建表 72 db.create_all() 73 # 初始化值.book是Book()类创建的对象.表示数据库books表中的一条记录. 74 book1 = Book() 75 book1.name = '帝国的沦陷' 76 book1.author_name = '周作人' 77 # 提交到数据库 78 # 初始化完成之后必须提交.否则不会生效 79 # db.session.add(对象) 80 db.session.add(book1) 81 db.session.commit() 82 app.run()
常用的SQLAlchemy查询过滤器
常用的SQLAlchemy查询执行器
1 """ 2 1.设置配置文件: 3 2.创建数据库对象db = SQLAlchemy(app): 4 3.创建模型类class Book(db.Model): 5 4.创建表db.create_all(): 6 7 注意:sqlalchemy只是连接数据库,不能创建数据库 8 回滚:rollback,不是callback 9 """ 10 from flask import Flask 11 from flask_sqlalchemy import SQLAlchemy # 导入数据库 12 13 app = Flask(__name__) 14 15 16 # 1.>设置配置文件 17 class Config: 18 SQLALCHEMY_DATABASE_URI = 'mysql://root:password@localhost:3306/test20' 19 # 动态追踪修改设置,如未设置只会提示警告,不会报错.这个必须设置 20 app.config['SQLALCHEMY_TRACK_MODIFICATIONS'] = False 21 22 23 # flask的app对象必须和配置进行关联 24 app.config.from_object(Config) 25 # app交给数据库关联 26 db = SQLAlchemy(app) 27 28 # ---------------创建两张表---------------- 29 """ 30 角色表和用户表:一对多的关系.一个角色对应着多个用户 31 一个用户只有一个角色 32 33 34 角色表:admin管理员 user普通用户 35 用户表:张三(管理员),李四(普通),王五(普通) 36 37 一个角色可以对应多个用户:一对多 38 39 """ 40 41 42 class Role(db.Model): 43 """角色表""" 44 __tablename__ = 'roles' 45 id = db.Column(db.Integer, primary_key=True) 46 name = db.Column(db.String(128)) 47 # 设置关系 48 # 让角色和用户表进行关联 49 # 在设置关系的时候,1的一方设置关系,多的地方设置外键 50 # 用在多表查询的时候使用. 51 """ 52 role 53 Out[15]: Role = admin 54 55 In [16]: role.us 56 Out[16]: 57 [User = wang,Email = wang@163.com, 58 User = zhou,Email = zhou@163.com, 59 User = qian,Email = qian@gmail.com, 60 User = liu,Email = liu@itheima.com] 61 62 """ 63 # backref='role' 反向查询,需要给User设置一个属性,属性名字:role,属性名可以随意取 64 us = db.relationship('User', backref='role') 65 66 def __repr__(self): 67 """返回一个可读的字符串,打印数据<平时不需要设置>""" 68 return '角色:%s' % self.name 69 70 71 class User(db.Model): 72 """用户表""" 73 __tablename__ = 'users' 74 id = db.Column(db.Integer, primary_key=True) 75 name = db.Column(db.String(128)) 76 email = db.Column(db.String(128)) 77 password = db.Column(db.String(128)) 78 # 在多的一方设置外键 79 role_id = db.Column(db.Integer, db.ForeignKey('roles.id')) 80 81 def __repr__(self): 82 """返回一个可读的字符串,打印数据<平时不需要设置>""" 83 # 'User = %s,%s' :注意这个格式,是User类中的email属性.对应到数据库中就是users表中的email字段 84 return '姓名:%s,邮箱:%s' % (self.name, self.email) 85 86 # ipython下面执行下面的语句,然后使用ipython进行测试 87 # from more_table import * 88 89 @app.route('/') 90 def index(): 91 u = User.query.all() 92 return 'index' 93 94 95 # 查询有多少个管理员,分别叫什么 96 97 if __name__ == '__main__': 98 # 删除表,如果存在就先删除,下面会再次创建 99 db.drop_all() 100 # 创建数据库中的表 101 # 4.>创建表 102 db.create_all() 103 ro1 = Role(name='admin') 104 db.session.add(ro1) 105 db.session.commit() 106 # 再次插入一条数据 107 ro2 = Role(name='user') 108 db.session.add(ro2) 109 db.session.commit() 110 # 提交到数据库 111 # 初始化完成之后必须提交.否则不会生效 112 # db.session.add(对象) 113 us1 = User(name='王佳芝', email='wang@163.com', password='123456', role_id=ro1.id) 114 us2 = User(name='庄聚贤', email='zhang@189.com', password='201512', role_id=ro2.id) 115 us3 = User(name='陈洪静', email='chen@126.com', password='987654', role_id=ro2.id) 116 us4 = User(name='周作人', email='zhou@163.com', password='456789', role_id=ro1.id) 117 us5 = User(name='唐景生', email='tang@itheima.com', password='158104', role_id=ro2.id) 118 us6 = User(name='吴晗', email='wu@gmail.com', password='5623514', role_id=ro2.id) 119 us7 = User(name='钱之江', email='qian@gmail.com', password='1543567', role_id=ro1.id) 120 us8 = User(name='柳弄币', email='liu@itheima.com', password='867322', role_id=ro1.id) 121 us9 = User(name='李谦钱', email='li@163.com', password='4526342', role_id=ro2.id) 122 us10 = User(name='孙博文', email='sun@163.com', password='235523', role_id=ro2.id) 123 db.session.add_all([us1, us2, us3, us4, us5, us6, us7, us8, us9, us10]) 124 db.session.commit() 125 app.run() 126 127 """ 128 role 查询user role.us 很好查 129 130 user 查询 role 131 132 """
1.查询所有用户数据
2.查询有多少个用户
3.查询第1个用户
4.查询id为4的用户[3种方式]
5. 查询名字结尾字符为xxx的所有数据[开始/包含]
![](https://img2018.cnblogs.com/blog/1517085/201810/1517085-20181026181703702-1401981260.png)
6. 查询名字不等于王佳芝的所有数据[2种方式]
7. 查询名字以王开头并且和邮箱以wang开头的所有数据[2种方式]
![](https://img2018.cnblogs.com/blog/1517085/201810/1517085-20181026181830031-785685463.png)
8. 查询password是 `123456` 或者 `email` 以 `itheima.com` 结尾的所有数据
![](https://img2018.cnblogs.com/blog/1517085/201810/1517085-20181026181904493-828949364.png)
9. 查询id为 [1, 3, 5, 7, 9] 的用户列表
10. 查询name为孙博文的角色数据
11. 查询所有用户数据,并以邮箱排序(降序排序)
12. 每页3个,查询第2页的数据
表中所有数据: