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

版权声明:本作品采用知识共享署名-非商业性使用-禁止演绎 2.5 中国大陆许可协议进行许可。

posted @ 2018-10-26 18:22  砚台是黑的  阅读(290)  评论(0编辑  收藏  举报
  1. 1 起风了 买辣椒也用券
起风了 - 买辣椒也用券
00:00 / 00:00
An audio error has occurred.

作词 : 米果

作曲 : 高橋優

编曲 : 池窪浩一 (Kouichi Ikekubo)

这一路上走走停停

顺着少年漂流的痕迹

迈出车站的前一刻

竟有些犹豫

不禁笑这近乡情怯

仍无可避免

而长野的天

依旧那么暖

风吹起了从前

从前初识这世间

万般流连

看着天边似在眼前

也甘愿赴汤蹈火去走它一遍

如今走过这世间

万般流连

翻过岁月不同侧脸

措不及防闯入你的笑颜

我曾难自拔于世界之大

也沉溺于其中梦话

不得真假 不做挣扎 不惧笑话

我曾将青春翻涌成她

也曾指尖弹出盛夏

心之所动 且就随缘去吧

逆着光行走 任风吹雨打

短短的路走走停停

也有了几分的距离

不知抚摸的是故事 还是段心情

也许期待的不过是 与时间为敌

再次看到你

微凉晨光里

笑得很甜蜜

从前初识这世间

万般流连

看着天边似在眼前

也甘愿赴汤蹈火去走它一遍

如今走过这世间

万般流连

翻过岁月不同侧脸

措不及防闯入你的笑颜

我曾难自拔于世界之大

也沉溺于其中梦话

不得真假 不做挣扎 不惧笑话

我曾将青春翻涌成她

也曾指尖弹出盛夏

心之所动 且就随缘去吧

晚风吹起你鬓间的白发

抚平回忆留下的疤

你的眼中 明暗交杂 一笑生花

暮色遮住你蹒跚的步伐

走进床头藏起的画

画中的你 低着头说话

我仍感叹于世界之大

也沉醉于儿时情话

不剩真假 不做挣扎 无谓笑话

我终将青春还给了她

连同指尖弹出的盛夏

心之所动 就随风去了

以爱之名 你还愿意吗

吉他 : 池窪浩一 (Kouichi Ikekubo)

吉他 : 池窪浩一 (Kouichi Ikekubo)

贝斯 : 小島剛広 (Takehiro Kojima)

鼓 : 吉田佳史 (TRICERATOPS) (Yoshifumi Yoshida(TRICERATOPS))

键盘 : 平畑徹也 (Tetsuya Hirahata)

小提琴 : 須磨和声 (Wasei Suma)

弦乐 : 須磨和声/池窪浩一

录音工程 : 玉乃井光紀 (Mitsunori Tamanoi) - studioFine

发行 : Negia Entertainment Inc.

特别支持:中村光雄(Mitsuo Nakamura)