python day45_Flask入门

数据库基本操作

Flask-SQLAlchemy中,插入、修改、删除操作,均由数据库会话管理。

会话用 db.session 表示。在准备把数据写入数据库前,要先将数据添加到会话中然后调用 commit()方法提交会话。
Flask-SQLAlchemy 中,查询操作是通过 query 对象操作数据。

最基本的查询是返回表中所有数据,可以通过过滤器进行更精确的数据库查询。

常用的SQLAlchemy查询过滤器

14.JPG

常用的SQLAlchemy查询执行器

15.JPG

创建表

db.create_all()

删除表

db.drop_all()

注意!!!

创建表和删除表 只是我们在初学阶段使用 以后真正开发 不会用

具体示例操作

需求: 创建两张表 一个用户表一个角色表,使用SQLAlchemy 进行基本的增删改查

创建表并添加数据:

from flask import Flask
from flask_sqlalchemy import SQLAlchemy


app = Flask(__name__)
# manager = Manager(app)
# 配置
app.config['SQLALCHEMY_DATABASE_URI'] = 'mysql://root:mysql@127.0.0.1:3306/test'
app.config['SQLALCHEMY_TRACK_MODIFICATIONS'] = False
# 数据库
my_db = SQLAlchemy(app)
# 创建模型
class User(my_db.Model):
    __tablename__ = 't_user'
    id = my_db.Column(my_db.Integer,primary_key=True)
    name = my_db.Column(my_db.String(64),unique=True)
    email = my_db.Column(my_db.String(64),unique=True)
    password = my_db.Column(my_db.String(64))
    # 在多的一方 定义外键
    role_id = my_db.Column(my_db.Integer,my_db.ForeignKey('t_role.id'))



class Role(my_db.Model):
    __tablename__ = 't_role'
    id = my_db.Column(my_db.Integer,primary_key=True)
    name = my_db.Column(my_db.String(64),unique=True)
    # 在一的一方 定义关系引用
    users = my_db.relationship('User',backref = 'role')


if __name__ == '__main__':
    my_db.drop_all()
    my_db.create_all()
    ro1 = Role(name='admin')
    my_db.session.add(ro1)
    my_db.session.commit()
    # 再次插入一条数据
    ro2 = Role(name='user')
    my_db.session.add(ro2)
    my_db.session.commit()
    us1 = User(name='wang', email='wang@163.com', password='123456', role_id=ro1.id)
    us2 = User(name='zhang', email='zhang@189.com', password='201512', role_id=ro2.id)
    us3 = User(name='chen', email='chen@126.com', password='987654', role_id=ro2.id)
    us4 = User(name='zhou', email='zhou@163.com', password='456789', role_id=ro1.id)
    us5 = User(name='tang', email='tang@baidu.com', password='158104', role_id=ro2.id)
    us6 = User(name='wu', email='wu@gmail.com', password='5623514', role_id=ro2.id)
    us7 = User(name='qian', email='qian@gmail.com', password='1543567', role_id=ro1.id)
    us8 = User(name='liu', email='liu@baidu.com', password='867322', role_id=ro1.id)
    us9 = User(name='li', email='li@163.com', password='4526342', role_id=ro2.id)
    us10 = User(name='sun', email='sun@163.com', password='235523', role_id=ro2.id)
    my_db.session.add_all([us1, us2, us3, us4, us5, us6, us7, us8, us9, us10])
    my_db.session.commit()
    # app.run(debug=True)

查询:

"""查询所有用户数据
查询有多少个用户
查询第1个用户
查询id为4的用户[3种方式]
查询名字结尾字符为g的所有数据[开始/包含]
查询名字不等于wang的所有数据[2种方式]
查询名字和邮箱都以 li 开头的所有数据[2种方式]
查询password是 `123456` 或者 `email` 以 `itheima.com` 结尾的所有数据
查询id为 [1, 3, 5, 7, 9] 的用户列表
查询name为liu的角色数据
查询所有用户数据,并以邮箱排序
每页3个,查询第2页的数据"""

进入ipython:
    
"""
#查询所有用户数据
User.query.all()

#查询有多少个用户
User.query.count()

#查询第1个用户
User.query.first()

#查询id为4的用户[3种方式]
User.query.get(4)
User.query.filter_by(id=4).first()
User.query.filter(User.id==4).first()

#基本查询两个都可以. filter更强大, 可以支持更多的查询语句


#查询名字结尾字符为g的所有数据[开始/包含]
User.query.filter(User.name.endswith("g")).all()
User.query.filter(User.name.contains("o")).all()


#查询名字不等于wang的所有数据[2种方式]
from sqlalchemy import not_
User.query.filter(not_(User.name == 'wang')).all()
User.query.filter(User.name != 'wang').all()


#查询名字和邮箱都以 li 开头的所有数据[2种方式]
from sqlalchemy import and_
In [22]: User.query.filter(and_(User.name.startswith("li"), User.email.startswith("li"))).all()

In [23]: User.query.filter(User.name.startswith("li"), User.email.startswith("li")).all()

#查询password是 `123456` 或者 `email` 以 `baidu.com` 结尾的所有数据
User.query.filter(or_(User.password=="123456", User.email.endswith("itheima.com"))).all()

#查询id为 [1, 3, 5, 7, 9] 的用户列表
User.query.filter(User.id.in_([1, 3, 5, 7, 9])).all()

#查询name为liu的角色数据
user = User.query.filter(User.name=='liu').first()
user.role.name



#查询所有用户数据,并以邮箱排序
User.query.order_by('email').all()


#每页3个,查询第2页的数据
# 第一个参数是:第几页,第二个参数是每页个数 第三个参数是error信息 不显示
paginate = User.query.paginate(2, 3, False)

paginate.items # 查询数据

paginate.page # 当前页数

paginate.pages # 总页数

数据库迁移

  • 在开发过程中,需要修改数据库模型,而且还要在修改之后更新数据库。最直接的方式就是删除旧表,但这样会丢失数据。
  • 更好的解决办法是使用数据库迁移框架,它可以追踪数据库模式的变化,然后把变动应用到数据库中。
  • Flask中可以使用Flask-Migrate扩展,来实现数据迁移。并且集成到Flask-Script中,所有操作通过命令就能完成。
  • 为了导出数据库迁移命令,Flask-Migrate提供了一个MigrateCommand类,可以附加到flask-scriptmanager对象上。

安装及执行

  • 安装要在虚拟环境py_flask中安装

    pip install flask-migrate

  • 执行命令分三步:

    1. init : 创建迁移文件夹的 终端执行: python flask_03_sqlal.py db init
      生成文件夹 migrations ,此时还没有任何东西
    2. migrate -m: 生成迁移文件的 -m 加注释 终端执行: 首先在mysql执行创建数据库的命令,
      然后执行:python flask_03_sqlal.py db migrate
    3. upgrate: 执行迁移
      python flask_03_sqlal.py db migrate
      以后要修改表结构, 只需要重复2,3两即可.
  • 完整的指令如下:

  • 实际操作顺序:

  • 1.python 文件 db init

  • 2.python 文件 db migrate -m"版本名(注释)"

  • 3.python 文件 db upgrade 然后观察表结构

  • 4.根据需求修改模型

  • 5.python 文件 db migrate -m"新版本名(注释)"

  • 6.python 文件 db upgrade 然后观察表结构

  • 7.若返回版本,则利用 python 文件 db history查看版本号

  • 8.python 文件 db downgrade(upgrade) 版本号

©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 216,402评论 6 499
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 92,377评论 3 392
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 162,483评论 0 353
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 58,165评论 1 292
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 67,176评论 6 388
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 51,146评论 1 297
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 40,032评论 3 417
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 38,896评论 0 274
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 45,311评论 1 310
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 37,536评论 2 332
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 39,696评论 1 348
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 35,413评论 5 343
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 41,008评论 3 325
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 31,659评论 0 22
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 32,815评论 1 269
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 47,698评论 2 368
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 44,592评论 2 353

推荐阅读更多精彩内容