Flask学习之旅--数据库
一、写在前面
在Web开发中,数据库操作是很重要的一部分,因为网站的很多重要信息都保存在数据库之中。而Flask在默认情况下是没有数据库、表单验证等功能的,但是可以用Flask-extension为Web应用添加这些功能。
二、Flask SQLite
SQLite是一款轻型的数据库,是遵守ACID的关系型数据库管理系统。由于Python对SQlite有内置的支持,因此在Flask应用程序中和SQLite进行交互是比较容易的。
首先需要创建一个SQLite数据库“user.db”,并在其中创建一张用户表。代码如下:
import sqlite3
conn = sqlite3.connect("user.db")
print("Connected!")
conn.execute("CREATE TABLE USER(username TEXT, password TEXT, EMAIL TEXT)")
print("Table created successfully!")
conn.close()
这里就不贴HTML代码了,就是一个注册页面,在注册的时候会将用户输入的用户名、密码和邮箱传到后台。在app.py中需要导入sqlite3模块,然后连接前面创建的user.db,在建立连接之后创建一个游标对象,然后编写SQL语句进行数据库操作,整个过程都算是比较容易的。app.py中的代码如下:
from flask import Flask, render_template, request
import sqlite3 as sql app = Flask(__name__) @app.route('/register', methods=['GET', 'POST'])
def register():
if request.method == 'GET':
return render_template('register.html')
else:
msg = ""
try:
username = request.form["usr"]
password = request.form["pwd"]
email = request.form["email"]
print(username, password, email)
with sql.connect("user.db") as con:
cur = con.cursor()
cur.execute("INSERT INTO USER (username, password, email) VALUES (?,?,?)",
(username, password, email))
con.commit()
msg = "注册成功!"
except:
con.rollback()
msg = "注册失败!请重试!"
finally:
con.close()
return render_template('register.html', msg=msg) if __name__ == '__main__':
app.run()
三、Flask SQLAlchemy
Flask-SQLAlchemy是Flask扩展,它将对SQLAlchemy的支持添加到Flask应用程序中。在Flask Web应用程序中使用原始SQL对数据库执行CRUD操作可能很繁琐,不过SQLAlchemy 为应用程序开发人员提供了SQL的全部功能和灵活性。它是一个对数据库的抽象,让开发者不用这些编写SQL语句,而是使用其提供的接口去操作数据库,这其中涉及到一个非常重要的思想:ORM(Object Relation Mapping,对象关系映射),主要的功能是实现模型对象到关系型数据库数据的映射。说白了就是使用通过对象去操作数据库。
1.Flask-SQLAlchemy安装
使用pip install flask-sqlalchemy进行安装。不过在安装的时候可能会出现如下错误:
pip._vendor.urllib3.exceptions.ReadTimeoutError: HTTPSConnectionPool(host='files.pythonhosted.org', port=443): Read timed out.
这是因为在下载python库的时候,由于国内网络原因,导致python包的下载速度非常慢,查看pip 文档,只要在 pip的时候控制超时即可, 具体参数为 --default-timeout=100, 后面的时间可以自己指定。因此可以用如下命令进行下载安装:
pip install --default-timeout=100 flask-sqlalchemy
2.Flask-SQLAlchemy配置
从此模块导入SQLAlchemy类,创建一个Flask应用程序对象并为要使用的数据库设置URI的代码如下:
from flask_sqlalchemy import SQLAlchemy app = Flask(__name__) # URI的格式为:用户名:密码@ip地址:端口号(默认可以不写)/数据库名app.config['SQLALCHEMY_DATABASE_URI'] = "mysql://root:qwer1234@localhost/flask"
3.配置的时候可能出现的问题及解决办法
1)ModuleNotFoundError: No module named 'MySQLdb'
解决办法:
使用pymysql模块,URI改为:
app.config['SQLALCHEMY_DATABASE_URI'] = "mysql+pymysql://root:qwer1234@localhost/flask"
2)Warning: (1366, "Incorrect string value: '\\xD6\\xD0\\xB9\\xFA\\xB1\\xEA...' for column 'VARIABLE_VALUE' at row 481")
解决办法:
改用mysql-connector,使用pip install mysql-connector下载安装,URI改为:
app.config['SQLALCHEMY_DATABASE_URI'] = "mysql+mysqlconnector://root:qwer1234@localhost/flask"
3)sqlalchemy.exc.NotSupportedError: (mysql.connector.errors.NotSupportedError) Authentication plugin 'caching_sha2_password' is not supported
解决办法:
出现这个错误是因为MySQL8.0采用了Use Strong Password Encryption for Authentication即强密码加密,而mysql.connector的引擎不支持caching_sha2_password的加密格式,所以解决思路有如下几种:
(1)重装MySQL,在Authentication Method中选择第二项(重装比较麻烦,我就没有尝试):

(2)在client端,将加密格式选择成mysql_native_password,命令如下(个人尝试后无效):
ALTER user 'root'@'localhost' IDENTIFIED WITH mysql_native_password BY 'root'
(3)最后一种是我自己摸索出来的,就是在URI设置的时候加上一个参数auth_plugin并设置为mysql_native_password:
app.config['SQLALCHEMY_DATABASE_URI'] = "mysql+mysqlconnector://root:qwer1234@localhost/flask?auth_plugin=mysql_native_password"
4.Flask-SQLAlchemy的基本操作
1) 常用查询过滤器:
过滤器得到的还只是一些对象,需要使用执行器来获取真正的数据。
filter(): 把过滤器添加到原查询上,返回一个新查询,需要使用模型类名去获取字段来进行比较;
filter_by():把等值(只能使用=比较操作)过滤器添加到查询上,返回一个新查询;
order_by():根据指定条件对查询结果进行排序,返回一个新查询;
group_by():根据指定条件对原查询结果进行分组,返回一个新查询。
2.)常用查询执行器
all():以列表的形式返回查询的所有结果;
first():返回查询的第一个结果;
first_or_404():同first(), 只不过如果没有找到的话,返回404错误;
get():返回指定主键对应的行;
get_or_404():返回指定主键对应的行,如不存在,返回404错误;
count():返回查询结果的数量;
paginate():返回一个Paginate对象,包含指定范围内的结果。
3.)查询条件
startswith('xx'):查询以xx开头的所有数据;
endswith('xx'):查询以xx结尾的所有数据;
not_():取反;
and_():返回and()条件满足的所有数据;
or_():返回or()条件满足的所有数据。
5.使用示例
app.py中代码如下:
from flask_sqlalchemy import SQLAlchemy
import mysql.connector app.config['SQLALCHEMY_DATABASE_URI'] = "mysql+mysqlconnector://root:qwer1234@localhost/flask?auth_plugin=mysql_native_password"
app.config['SQLALCHEMY_TRACK_MODIFICATIONS'] = True
app.config['SQLALCHEMY_COMMIT_ON_TEARDOWN'] = True # 获取SQLAlchemy实例对象
db = SQLAlchemy(app)
然后新建一个model.py,编写如下代码进行测试:
from app import db # 创建模型对象
class User(db.Model):
__tablename__ = "users"
id = db.Column(db.Integer, primary_key=True)
username = db.Column(db.String(16), unique=True)
password = db.Column(db.String(16))
email = db.Column(db.String(32), unique=True) def __repr__(self):
return '<User %r>' % self.username # 1.创建表
db.create_all()
print("Created Successfully!") # 2.增加记录
usr1 = User()
usr1.id = 1
usr1.username = "wang"
usr1.password = "wangwang"
usr1.email = "wang@163.com"
usr2 = User(id=2, username="yang", password="yang", email="yang@163.com")
db.session.add(usr1)
print("Add usr1")
db.session.add(usr2)
print("Add usr2")
db.session.commit() # 3.查询记录,注意查询返回对象,如果查询不到返回None
users1 = User.query.all() # 查询所有
print(users1)
print("User Count:", len(users1)) # 4.删除
user = User.query.get(1)
db.session.delete(user)
print("Delete usr1")
db.session.commit() users2 = User.query.all() # 查询所有
print(users2)
print("User Count:", len(users2))
运行结果如下所示:
Created Successfully!
Add usr1
Add usr2
[<User 'wang'>, <User 'yang'>]
User Count: 2
Delete usr1
[<User 'yang'>]
User Count: 1
Flask学习之旅--数据库的更多相关文章
- flask学习笔记(-操作数据库)
Python 数据库框架 大多数的数据库引擎都有对应的 Python 包,包括开源包和商业包.Flask 并不限制你使用何种类型的数据库包,因此可以根据自己的喜好选择使用 MySQL.Postgres ...
- Flask学习之旅--还是数据库(sqlacodegen + SQL Alchemy)
一.写在前面 其实之前已经写过一篇关于 Flask 中使用数据库的博客了,不过那一篇博客主要是记录我在使用 Flask + MySQL8.0 时所遇到的一些问题(如果用的不是 MySQL8.0估计就没 ...
- Flask学习之旅--简易留言板
一.写在前面 正所谓“纸上得来终觉浅,方知此事要躬行”,在看文档和视频之余,我觉得还是要动手做点什么东西才能更好地学习吧,毕竟有些东西光看文档真的难以理解,于是就试着使用Flask框架做了一个简易留言 ...
- Flask学习笔记:数据库迁移操作flask-script+alembic/flask-migrate
数据库迁移是将代码中模型类(即表)的修改同步到数据库中, flask-sqlalchemy的模型类一旦使用create_all()映射到数据库中后,对这个模型类的修改(例如添加了一个新的字段)就不会再 ...
- Flask学习笔记:数据库ORM操作MySQL+pymysql/mysql-python+SQLAlchemy/Flask-SQLAlchemy
Python中使用sqlalchemy插件可以实现ORM(Object Relationship Mapping,模型关系映射)框架,而Flask中的flask-sqlalchemy其实就是在sqla ...
- Flask学习之旅--分页功能:分别使用 flask--pagination 和分页插件 layPage
一.前言 现在开发一个网站,分页是一个很常见的功能了,尤其是当数据达到一定量的时候,如果都显示在页面上,会造成页面过长而影响用户体验,除此之外,还可能出现加载过慢等问题.因此,分页就很有必要了. 分页 ...
- EF Code-First 学习之旅 数据库初始化
1.CreateDatabaseIfNotExists: 2.DropCreateDatabaseIfModelChanges: 3.DropCreateDatabaseAlways: 4.Custo ...
- EF Code-First 学习之旅 数据库初始化 (二)
Context类的基类构造函数有如下的参数 1.无参数 如果没有给基类构造函数添加参数,它会在local SQLEXPRESS server创建数据库,名为{Namespace}.{Context c ...
- Flask学习之旅--用 Python + Flask 制作一个简单的验证码系统
一.写在前面 现在无论大大小小的网站,基本上都会使用验证码,登录的时候要验证,下载的时候要验证,而使用的验证码也从那些简简单单的字符图形验证码“进化”成了需要进行图文识别的验证码.需要拖动滑块的滑动验 ...
随机推荐
- WPF窗口继承实现统一风格的自定义窗口
如何实现一个窗口的风格(style),让所有的窗口都继承这样同样的风格,包括标题栏,放大.缩小和关闭按钮. 那么,我们可不可以就建立一个Base窗口,然后将这个窗口的风格给设计好之后,所有的窗口都继承 ...
- [C++] 反编译器
各种开源的decompiler都不太好用,眼下最好的反编译器是IDA pro. 尽管是收费的,只是破解版非常好找. 我试过5.5版本号的,还不错. 我把windows notepad进行了反编译,多少 ...
- 1 WCF 一个基础理论 以及如何实现一个简单wcf服务
1 SOA : service oriented architecture 面向服务的架构 2 web service标准 3 概念理解图 4 WCF类库 项目的 wcf简单实现 首先创建一个简单的w ...
- 扪心自问,强大的UI框架,给我们带来了什么?(作者因此写了一个GuiLite)
MFC, QT, MINIGUI, ANDROID, IOS,如果这些平台,你都使用过,在下真心佩服,也相信你对这篇文章最具有发言权,真心期待你的回复和建议. 这些著名的UI说出来都让人如雷贯耳,如果 ...
- WPF中使用AxisAngleRotation3D实现CAD的2D旋转功能
原文:WPF中使用AxisAngleRotation3D实现CAD的2D旋转功能 对于CAD图形来说,3D旋转比较常用,具体实现方法在上篇文章<WPF中3D旋转的实现 >中做了 ...
- 图形的认识(curve,surface,hypersurface)
平滑函数(smooth function): curve:曲线: 二维平面: surface:曲面: 三维空间: hypersurface:超曲面: 更高维度: 1. surface 是对平面的泛化, ...
- 微信小程序知识集锦
1.自定义属性/获取属性值 自定义属性: <view bindtap='shopPost' data-myid='item.goods_id' ></view> 获取属性: s ...
- Qt使用预编译头文件Using Precompiled Headers(提升10倍以上)
预编译头文件是被很多编译器用来编译稳定的代码以及将编译好的稳定代码存储在二进制文件中用于提升编译性能.在随后的编译中,编译器将加载存储状态继续编译指定的文件.每一个随后的编译将更快,因为稳定的代码不需 ...
- Asp.NET的目的是学习
一.概观 二.具体介绍 1.Request对象 Request对象是用来获取client在请求一个页面或传送一个Form时提供的全部信息.这包含可以标识浏览器和用户的HTTP变量.存储在client的 ...
- 微软Insider Dev Tour 活动
总述 Insider Dev Tour 将在6月全球29个城市中展开.这次活动是通过与微软全球MVPs和RD合作进行的,并涵盖了微软最新的开者方面的最新消息. 日期提示 2018年5月7日 : 暂无其 ...