一、写在前面

  在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学习之旅--数据库的更多相关文章

  1. flask学习笔记(-操作数据库)

    Python 数据库框架 大多数的数据库引擎都有对应的 Python 包,包括开源包和商业包.Flask 并不限制你使用何种类型的数据库包,因此可以根据自己的喜好选择使用 MySQL.Postgres ...

  2. Flask学习之旅--还是数据库(sqlacodegen + SQL Alchemy)

    一.写在前面 其实之前已经写过一篇关于 Flask 中使用数据库的博客了,不过那一篇博客主要是记录我在使用 Flask + MySQL8.0 时所遇到的一些问题(如果用的不是 MySQL8.0估计就没 ...

  3. Flask学习之旅--简易留言板

    一.写在前面 正所谓“纸上得来终觉浅,方知此事要躬行”,在看文档和视频之余,我觉得还是要动手做点什么东西才能更好地学习吧,毕竟有些东西光看文档真的难以理解,于是就试着使用Flask框架做了一个简易留言 ...

  4. Flask学习笔记:数据库迁移操作flask-script+alembic/flask-migrate

    数据库迁移是将代码中模型类(即表)的修改同步到数据库中, flask-sqlalchemy的模型类一旦使用create_all()映射到数据库中后,对这个模型类的修改(例如添加了一个新的字段)就不会再 ...

  5. Flask学习笔记:数据库ORM操作MySQL+pymysql/mysql-python+SQLAlchemy/Flask-SQLAlchemy

    Python中使用sqlalchemy插件可以实现ORM(Object Relationship Mapping,模型关系映射)框架,而Flask中的flask-sqlalchemy其实就是在sqla ...

  6. Flask学习之旅--分页功能:分别使用 flask--pagination 和分页插件 layPage

    一.前言 现在开发一个网站,分页是一个很常见的功能了,尤其是当数据达到一定量的时候,如果都显示在页面上,会造成页面过长而影响用户体验,除此之外,还可能出现加载过慢等问题.因此,分页就很有必要了. 分页 ...

  7. EF Code-First 学习之旅 数据库初始化

    1.CreateDatabaseIfNotExists: 2.DropCreateDatabaseIfModelChanges: 3.DropCreateDatabaseAlways: 4.Custo ...

  8. EF Code-First 学习之旅 数据库初始化 (二)

    Context类的基类构造函数有如下的参数 1.无参数 如果没有给基类构造函数添加参数,它会在local SQLEXPRESS server创建数据库,名为{Namespace}.{Context c ...

  9. Flask学习之旅--用 Python + Flask 制作一个简单的验证码系统

    一.写在前面 现在无论大大小小的网站,基本上都会使用验证码,登录的时候要验证,下载的时候要验证,而使用的验证码也从那些简简单单的字符图形验证码“进化”成了需要进行图文识别的验证码.需要拖动滑块的滑动验 ...

随机推荐

  1. Android SDK location should not contain whitespace, as this cause problems with NDK tools

    解决方案一: The easiest solution is to move the SDK somewhere else, where there is no space or other whit ...

  2. Visual Studio for Mac第四预

    微软发布Visual Studio for Mac第四预览版 去年 11 月,微软发布了 Visual Studio for Mac 的首个预览版本,并且承诺后续数月会带来更多功能.而今天,随着 Vi ...

  3. svg查看预览 , 鼠标控制放大缩小 , 托拉拽等

    自己写是不可能了 , 所以要借用插件 svg-panzoom.js 地址 : https://github.com/ariutta/svg-pan-zoom#demos 及常见问题https://ww ...

  4. VS2015如何自定义类模板、我的模板——原来这么简单!

    在前一段时间忽然想给自己电脑上的vs新建类的时候添加一个自定义个注释,但是在网上搜了很久都是说vs2012之类的方法系统也都是win7.XP之类的独独没有win8的.故此自己不断的尝试修改发现方法如下 ...

  5. Xcode 4.5( iOS6 SDK)、旧版本号cocos2d,支持iPhone5解析度

    支持iPhone5全屏 1假设没有支持iPhone5是否.直接运行程序可以准备提交.开放iPhone5模拟器,你会发现上面有黑色的程序.没有矩形. 2真正运行该程序时,.你会发现程序回程屏幕高度.它是 ...

  6. 【转】java内部类的作用分析

    转自:http://blog.csdn.net/ilibaba/article/details/3866537 另收另外一篇有空的时候看:http://jinguo.iteye.com/blog/71 ...

  7. OpenCV实现马赛克和毛玻璃滤镜效果

    一.马赛克效果 马赛克的实现原理是把图像上某个像素点一定范围邻域内的所有点用邻域内随机选取的一个像素点的颜色代替,这样可以模糊细节,但是可以保留大体的轮廓. 以下OpenCV程序实现马赛克效果,通过鼠 ...

  8. 中英文对照 —— 互联网、IT(信息科技)、编程

    1. 网站 web-portal:门户网站: 2. 工具与方法 crowdsourcing:众包, crowd ⇒ 众: 3. 软件 MVP:最小化可行产品,Minimum Viable Produc ...

  9. hdoj 5087 Revenge of LIS II 【第二长单调递增子】

    称号:hdoj 5087 Revenge of LIS II 题意:非常easy,给你一个序列,让你求第二长单调递增子序列. 分析:事实上非常easy.不知道比赛的时候为什么那么多了判掉了. 我们用O ...

  10. 阿凡达是脸,教你的脸在线(包括URL和使用)

    官方网站:http://www.mcdonalds.at/avatar/ 英文版本号:lid=finland" target="_blank">http://www ...