flask连接数据库?在python3下怎样用flask-sqlalchemy对mysql数据库操作
本篇文章给大家谈谈flask连接数据库,以及在python3下怎样用flask-sqlalchemy对mysql数据库操作对应的知识点,文章可能有点长,但是希望大家可以阅读完,增长自己的知识,最重要的是希望对各位有所帮助,可以解决了您的问题,不要忘了收藏本站喔。
简单分析Flask 数据库迁移详情
1、使用 Flask-Migrate实现数据库迁移
db.create_all()不会重新创建表或是更新表,需要先使用db.drop_all()删除数据库中所有的表之后再调用db.create_all()才能重新创建表,但是这样的话,原来表中的数据就都被删除了,这肯定是不行的,这时就出现了数据库迁移的概念。
在开发过程中,随着需求的变化,有可能需要添加或修改表的一些字段,但是原表中的数据不能删除,此时就需要创建新表,并将旧表中的数据迁移至新表中,Flask-Migrate这个扩展就可以在不破坏数据的情况下更新数据库表的结构,并完成数据从旧表到新表的迁移。
2、Flask-Migrate的使用
可以使用pip install flask-migrate进行安装。在程序中,我们实例化 Flask_Migrate提供的 Migrate类,进行初始化操作。
实例化 Migrate类,需要传入 Flask实例 app和 SQLAlchemy创建的实例 db。
2.1数据库的迁移过程
先定义 User模型类。
创建迁移环境
在开始迁移数据之前,需要先使用下面的命令创建一个迁移环境:
迁移环境只需创建一次,创建后会在项目根目录下生成一个 migrations目录,其中包含了自动生成的配置文件和迁移版本目录。
生成迁移脚本
使用如下命令自动生成迁移脚本:
-m选项添加备注信息,执行后迁移版本目录生成了迁移脚本。
迁移脚本内有两个函数:
upgrade():把迁移中的改动应用到数据库中
downgrade():将改动撤销
自动生成的迁移脚本会根据模型定义和数据库当前状态的差异,生成upgrade()和downgrade()函数的内容,不一定完全正确,有必要再进行检查一下。
更新数据库
生成了迁移脚本后,使用flask db upgrade命令可完成对数据库的更新。执行后即可生成数据库及表。
如果之后我们需要改动 user表中的字段,比如添加一个mobile字段,我们只需在 User模型类中添加该属性,之后执行flask db migrate-m'注释'和flask db upgrade命令即可。
如果想要回滚迁移的话,可以执行flask db downgrade命令。
3、总结
这里只是介绍如何在 Flask中进行数据库迁移,关于在生产环境下,是否需要使用迁移工具或者使用何种工具进行迁移,这里不做讨论,至于我的话,在生产环境中,我没有使用过Flask-Migrate,而是选择编写 SQL脚本来处理数据库及表的更新或改动,我觉得这样更不容易出错,其实各有各的好处,看自己选择。
flask +mysql 怎样更新数据库
1
首
先简单叙述一下,为什么会有update这个修改功能,就比方说,我们都有空间,空间里面都有一个功能叫做发文章,如果没有update,
这个功能,那就会导致,你的文章提交保存之后,就永远不能修改.你说,我写文章能够保存100%的正确.但是,如果你要改呢?所以,
就有update这个关键字.
2
先
看第一个案例.这里只说明案例不剖析原理.首先我们要明确我们做什么.我们要更新数据,所以,就要使用update的语法结构.
在这个步骤之前,我们要写说一下,现在的环境变.首先,你要有库,要有表,还要有数据,没有数据,怎么可能会有更新你要更新的数据呢.
然后有库有表有数据,就可以操作数剧了.
3
做
第一个操作:更新 content的内容为 content.这里,就是一个简单的修改,然后修改表里面所有的
content字段里面的数据.都会把字段为 content的值,修改成 content,这个是最简单的更新数据的情况.
但是这个一般不实用,我在开发的过程中,也很少使用到这种情况.因为有些表里面不是一条, 2条数据,有可能就是上百万的数据.更新一下,
就够你哭的了.
第一个图,是查询出来数据,然后在执行更新.然后你会发现表里面所有的content字段的值都变成了content了.
4
如
果我们不是全部更新呢?我们就想更新某些条数据,可以不可以做呢?答案是肯定可以的.这里 update一样可以如 select
那样使用过滤条件,就是使用关键字where.比方说,我们要把id= 1的数据content内容改成,'这个是id1的内容'
5
在
更新的时候,特别是在控制台下,有时候,你会发现这样的情况,就是你明明已经更新了,而且在更新之后,查询的,但是,
在开发中就是查询不到更新的内容,那有可能是因为你没有做commit.在更改表里面的内容的时候,都是有事物的这个概念的.
就是你不提交(commit)你做的东西,其他人是看不到你更新的内容的.
6
这里只是给出了单表的操作方法,在update的时候,一样可以进行多表操作.做错的过程中,一定要找到对应关系,否则会出现你意想不到的修改数据的错误.
在python3下怎样用flask-sqlalchemy对mysql数据库操作
以 Debian/Ubuntu为例(请确保有管理员权限):
1.MySQL
代码如下:
apt-get install mysql-server
apt-get install mysql-client
apt-get install libmysqlclient15-dev
2.python-mysqldb
代码如下:
apt-get install python-mysqldb
3.easy_install
代码如下:
wget http://peak.telecommunity.com/dist/ez_setup.py
python ez_setup.py
4.MySQL-Python
代码如下:
easy_install MySQL-Python
5.SQLAlchemy
代码如下:
easy_install SQLAlchemy
6、安装完成后使用下面代码测试连接
代码如下:
from sqlalchemy import create_engine
from sqlalchemy.orm import sessionmaker
DB_CONNECT_STRING='mysql+mysqldb://root:123@localhost/ooxx?charset=utf8'
engine= create_engine(DB_CONNECT_STRING, echo=True)
DB_Session= sessionmaker(bind=engine)
session= DB_Session()
7、数据操作(增删改查)
代码如下:
from sqlalchemy import func, or_, not_
user= User(name='a')
session.add(user)
user= User(name='b')
session.add(user)
user= User(name='a')
session.add(user)
user= User()
session.add(user)
session.commit()
query= session.query(User)
print query#显示SQL语句
print query.statement#同上
for user in query:#遍历时查询
print user.name
print query.all()#返回的是一个类似列表的对象
print query.first().name#记录不存在时,first()会返回 None
# print query.one().name#不存在,或有多行记录时会抛出异常
print query.filter(User.id== 2).first().name
print query.get(2).name#以主键获取,等效于上句
print query.filter('id= 2').first().name#支持字符串
query2= session.query(User.name)
print query2.all()#每行是个元组
print query2.limit(1).all()#最多返回 1条记录
print query2.offset(1).all()#从第 2条记录开始返回
print query2.order_by(User.name).all()
print query2.order_by('name').all()
print query2.order_by(User.name.desc()).all()
print query2.order_by('name desc').all()
print session.query(User.id).order_by(User.name.desc(), User.id).all()
print query2.filter(User.id== 1).scalar()#如果有记录,返回第一条记录的第一个元素
print session.query('id').select_from(User).filter('id= 1').scalar()
print query2.filter(User.id> 1, User.name!='a').scalar()# and
query3= query2.filter(User.id> 1)#多次拼接的 filter也是 and
query3= query3.filter(User.name!='a')
print query3.scalar()
print query2.filter(or_(User.id== 1, User.id== 2)).all()# or
print query2.filter(User.id.in_((1, 2))).all()# in
query4= session.query(User.id)
print query4.filter(User.name== None).scalar()
print query4.filter('name is null').scalar()
print query4.filter(not_(User.name== None)).all()# not
print query4.filter(User.name!= None).all()
print query4.count()
print session.query(func.count('*')).select_from(User).scalar()
print session.query(func.count('1')).select_from(User).scalar()
print session.query(func.count(User.id)).scalar()
print session.query(func.count('*')).filter(User.id> 0).scalar()# filter()中包含 User,因此不需要指定表
print session.query(func.count('*')).filter(User.name=='a').limit(1).scalar()== 1#可以用 limit()限制 count()的返回数
print session.query(func.sum(User.id)).scalar()
print session.query(func.now()).scalar()# func后可以跟任意函数名,只要该数据库支持
print session.query(func.current_timestamp()).scalar()
print session.query(func.md5(User.name)).filter(User.id== 1).scalar()
query.filter(User.id== 1).update({User.name:'c'})
user= query.get(1)
print user.name
user.name='d'
session.flush()#写数据库,但并不提交
print query.get(1).name
session.delete(user)
session.flush()
print query.get(1)
session.rollback()
print query.get(1).name
query.filter(User.id== 1).delete()
session.commit()
print query.get(1)
好了,文章到此结束,希望可以帮助到大家。