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.查询id4的用户[3种方式]

5. 查询名字结尾字符为xxx的所有数据[开始/包含]

6. 查询名字不等于王佳芝的所有数据[2种方式]

7. 查询名字以王开头并且和邮箱以wang开头的所有数据[2种方式]

8. 查询password `123456` 或者 `email`  `itheima.com` 结尾的所有数据
 
9. 查询id [1, 3, 5, 7, 9] 的用户列表

10. 查询name孙博文的角色数据

11. 查询所有用户数据,并以邮箱排序(降序排序)

12. 每页3个,查询第2页的数据

表中所有数据:


原文地址:https://www.cnblogs.com/huaibin/p/9858014.html