利用 SQLAlchemy 进行数据库操作及结合 Flask 开发 Web 应用
1. SQLAlchemy 会话创建与 ORM 查询
在使用 SQLAlchemy 与数据库交互时, sqlalchemy.orm.sessionmaker() 函数起着关键作用,它能创建一个 sqlalchemy.orm.session.sessionmaker 类,该类包含用于与数据库交互的属性和方法。以下是管理会话数据常用的方法:
- add() :添加或替换与 Base 子类实例化对象绑定的数据库记录。
- delete() :删除与对象绑定的记录。
- commit() :将更改应用到数据库。
当表创建完成后,就可以插入数据。插入数据的步骤如下:
1. 创建类的实例,例如通过 MyTable 创建对象。
2. 创建会话:
from sqlalchemy.orm import sessionmaker
Session = sessionmaker(bind=engine)
session = Session()
- 添加新对象并提交更改:
object = MyTable(message="Hello World!")
session.add(object)
session.commit()
会话定义完成后,就可以执行与 Base 实例化对象及相关表的查询操作。常用的查询方法有:
- query.first() :返回搜索到的第一个对象。
- query.all() :返回包含所有搜索结果对象的列表。
- query.filter() :返回满足类属性逻辑表达式的查询对象。
以下是一个查询示例:
query = session.query(MyTable)
instance = query.first()
print (instance.message) # Hello World!
另外, Session 类还允许添加新对象或更新现有对象。可以使用 session.add(obj) 方法添加单个对象,也可以使用 session.add_all([obj1, obj2, obj3]) 方法添加对象列表。调用 add() 方法时,会在数据库中执行 INSERT 操作,并通过 commit() 方法确认会话数据。
以下是一个完整的插入数据示例( insert_data.py ):
#!/usr/local/bin/python3
from datetime import date
from sqlalchemy import create_engine
from sqlalchemy.orm import sessionmaker
from models import Author, Book
# 连接 SQLite 数据库
engine = create_engine('sqlite:///books_authors.db', echo=True)
# 获取会话
Session = sessionmaker(bind=engine)
session = Session()
# 插入作者
author_1 = Author('Author1')
author_2 = Author('Author2')
author_list = (author_1, author_2)
session.add_all(author_list)
session.commit()
# 插入书籍
book1 = Book('Book1', date(2019, 1, 1), '123456789')
book1.authors.append(author_1)
session.add(book1)
session.commit()
# 书籍查询
book = session.query(Book).filter(Book.isbn=='123456789').first()
print(book)
# 修改书籍数据
book.title = 'Learning Python Networking'
session.commit()
print(book)
执行上述脚本后,可以使用 SQLite 浏览器( https://sqlitebrowser.org )打开 book_authors.db 文件,检查书籍信息是否已更新。
2. Flask 与 SQLAlchemy 结合使用
对于常见的 Web 应用,通常建议使用 Flask 扩展,如 flask-sqlalchemy 。安装该扩展的命令如下:
pip install flask-sqlalchemy
创建 Flask 应用后,若要与 SQLAlchemy 集成,需要创建一个包含数据库路径的配置文件,以此创建 SQLAlchemy 对象来管理数据库。这里以 SQLite 数据库为例,简化配置,无需数据库服务器。
在 flask_sqlalchemy 文件夹的 config.py 文件中添加数据库配置:
#!/usr/local/bin/python3
import os
DEBUG = True
SQLALCHEMY_DATABASE_URI = 'sqlite:///' + os.path.join(os.path.dirname(__file__), 'books_database.db')
SECRET_KEY = 'SECRET_KEY'
SQLALCHEMY_DATABASE_URI 是 Flask-SQLAlchemy 扩展必需的配置项,代表数据库文件的本地地址。同时,还需要定义 SECRET_KEY 用于处理 Flask 表单。
以下是 books.py 文件的示例代码:
#!/usr/local/bin/python3
from flask import Flask, render_template, request
from flask_sqlalchemy import SQLAlchemy
import json
from flask_wtf import FlaskForm
from wtforms import StringField
from wtforms import TextAreaField
from wtforms.validators import DataRequired
from datetime import date
# Flask 应用和配置
app = Flask(__name__)
app.config.from_object('config')
db = SQLAlchemy(app)
# 定义路由和处理方法
@app.route('/new_book', methods=['POST'])
def new_book():
form = CreateBookForm()
if request.method == 'POST':
post = Book(request.form['title'], request.form['author'], request.form['description'])
db.session.add(post)
db.session.commit()
# 验证接收到的值
if request.form['title'] and request.form['author']:
return json.dumps({'html': '<span>New book saved in database</span>'})
return render_template('index.html', form=form, conf=app.config)
@app.route('/', methods=['GET'])
def index():
form = CreateBookForm()
return render_template('index.html', form=form, conf=app.config)
if __name__ == '__main__':
app.run()
db.create_all()
index.html 文件包含用于发送书籍信息的表单:
<html>
<body>
<form method="post" action="/new_book">
<dl>
{{ form.csrf_token }}
{{ form.title.label }} {{ form.title(style="width:100%") }}
{% for error in form.title.errors %} {{ error }} {% endfor %}
<br />
{{ form.author.label }} {{ form.author(style="width:100%") }}
{% for error in form.author.errors %} {{ error }} {% endfor %}
<br />
{{ form.description.label }} {{form.description(style="height:100px;width:100%") }}
{% for error in form.description.errors %} {{ error }} {% endfor %}
</dl>
<p><input type="submit" value="submit">
</form>
</body>
</html>
表单中添加了 CSRF 令牌( {{ form.csrf_token }} )以避免跨站脚本攻击和跨站请求伪造等安全问题。提交表单后,会显示书籍已保存到 SQLite 数据库的消息。
3. 相关操作流程总结
以下是使用 SQLAlchemy 插入数据和结合 Flask 开发 Web 应用的操作流程:
| 步骤 | SQLAlchemy 插入数据 | Flask 与 SQLAlchemy 结合 |
| ---- | ---- | ---- |
| 1 | 创建表 | 安装 flask-sqlalchemy |
| 2 | 创建类实例 | 创建配置文件 config.py |
| 3 | 创建会话 | 创建 Flask 应用并加载配置 |
| 4 | 添加对象并提交更改 | 定义路由和处理方法 |
| 5 | 执行查询操作 | 创建表单和 HTML 文件 |
4. 流程图
graph TD;
A[创建表] --> B[创建类实例];
B --> C[创建会话];
C --> D[添加对象];
D --> E[提交更改];
E --> F[执行查询];
G[安装 flask-sqlalchemy] --> H[创建配置文件];
H --> I[创建 Flask 应用并加载配置];
I --> J[定义路由和处理方法];
J --> K[创建表单和 HTML 文件];
通过以上步骤和示例代码,我们可以利用 SQLAlchemy 进行数据库操作,并结合 Flask 开发简单的 Web 应用,实现数据的持久化存储。
利用 SQLAlchemy 进行数据库操作及结合 Flask 开发 Web 应用(续)
5. 总结与回顾
在前面的内容中,我们详细介绍了如何使用 SQLAlchemy 进行数据库操作,包括会话的创建、数据的插入、查询以及更新等操作。同时,还讲解了如何将 Flask 与 SQLAlchemy 结合,开发一个简单的 Web 应用来实现数据的持久化存储。下面我们对这些内容进行一个简单的回顾。
- SQLAlchemy 操作 :通过
sessionmaker()函数创建会话,使用add()、delete()和commit()方法管理会话数据。查询操作则使用query.first()、query.all()和query.filter()等方法。 - Flask 与 SQLAlchemy 集成 :安装
flask-sqlalchemy扩展,创建配置文件config.py来指定数据库路径,然后在 Flask 应用中加载配置并定义路由和处理方法,最后创建表单和 HTML 文件来实现用户交互。
6. 常见问题解答
为了帮助大家更好地理解和应用这些知识,下面我们对一些常见问题进行解答。
| 问题 | 解答 |
|---|---|
| 1. 什么 Python 模块用于开发自己的 WSGI 服务器? | 文中未提及具体模块。 |
| 2. MVC 模式从开发者角度的主要优势是什么? | 文中未详细说明,但 MVC 模式有助于将应用的不同部分(模型、视图、控制器)分离,提高代码的可维护性和可扩展性。 |
| 3. 用什么 Django 脚本创建应用所需的文件结构? | 文中未提及具体脚本。 |
| 4. 用什么 Django 命令在应用中创建数据库? | 文中未提及具体命令。 |
| 5. Flask 中用于创建路由的注解是什么? | 是 @app.route() 注解,例如 @app.route('/new_book', methods=['POST']) 。 |
| 6. Flask 中哪个方法用于在模板文件夹中查找作为第一个参数提供的文件? | 是 render_template() 方法,例如 return render_template('index.html', form=form, conf=app.config) 。 |
| 7. 在 Flask 中使用 POST 方法向服务器发送信息时,用什么对象访问表单属性信息? | 可以使用 request.form 对象,例如 post = Book(request.form['title'], request.form['author'], request.form['description']) 。 |
| 8. Flask 中用于管理应用注册和认证过程的扩展是什么? | 文中未提及具体扩展。 |
| 9. SQLAlchemy 中哪个类负责实例化对象并连接到数据库? | 是 sessionmaker 类,通过它创建会话来连接数据库,例如 Session = sessionmaker(bind=engine) 。 |
| 10. Flask-SQLAlchemy 扩展所需的配置关键字是什么,它代表数据库文件的本地地址? | 是 SQLALCHEMY_DATABASE_URI ,例如 SQLALCHEMY_DATABASE_URI = 'sqlite:///' + os.path.join(os.path.dirname(__file__), 'books_database.db') 。 |
7. 进一步学习资源
为了让大家深入学习相关知识,下面提供一些进一步学习的资源:
- Flask 蓝图 : http://flask.pocoo.org/docs/1.0/blueprints 。蓝图对于需要在组件之间进行更多分离的项目非常有用,它可以将应用组织成更小、可重用的部分。
- 比较 Django、Flask 和 Pyramid : https://www.airpair.com/python/posts/django-flask-pyramid 。该链接提供了这三个 Python Web 框架的比较信息。
- SQLAlchemy 教程 : http://www.rmunn.com/sqlalchemy-tutorial/tutorial.html 。这是一个逐步的 SQLAlchemy 教程。
- Flask-Security 扩展 : https://pythonhosted.org/Flask-Security/quickstart.html#sqlalchemy-application 。该扩展可用于处理 Flask 应用中的安全问题。
- 使用 fastcgi 与 Flask : http://flask.pocoo.org/docs/1.0/deploying/fastcgi/ 。该链接介绍了如何使用 fastcgi 部署 Flask 应用。
8. 拓展思考
在实际应用中,我们还可以对上述内容进行拓展和优化。例如:
- 数据库优化 :可以考虑使用数据库索引来提高查询性能,或者使用连接池来管理数据库连接,减少连接开销。
- 错误处理 :在 Flask 应用中添加更完善的错误处理机制,例如对数据库操作失败、表单验证失败等情况进行处理,提高应用的健壮性。
- 安全性增强 :除了使用 CSRF 令牌,还可以考虑使用 HTTPS 协议来加密数据传输,防止数据在传输过程中被窃取。
9. 总结
通过本文的学习,我们掌握了使用 SQLAlchemy 进行数据库操作以及将 Flask 与 SQLAlchemy 结合开发 Web 应用的方法。从 SQLAlchemy 的会话创建、数据插入和查询,到 Flask 应用的配置、路由定义和表单处理,我们逐步构建了一个简单的 Web 应用来实现数据的持久化存储。同时,我们还了解了相关的操作流程、常见问题解答以及进一步学习的资源。希望这些知识能够帮助大家在实际项目中更好地应用 Python 进行 Web 开发。
10. 流程图回顾与拓展
graph TD;
A[创建表] --> B[创建类实例];
B --> C[创建会话];
C --> D[添加对象];
D --> E[提交更改];
E --> F[执行查询];
G[安装 flask-sqlalchemy] --> H[创建配置文件];
H --> I[创建 Flask 应用并加载配置];
I --> J[定义路由和处理方法];
J --> K[创建表单和 HTML 文件];
F --> L[数据库优化];
K --> M[错误处理];
M --> N[安全性增强];
这个拓展后的流程图展示了在完成基本的数据库操作和 Web 应用开发后,还可以进行数据库优化、错误处理和安全性增强等操作,进一步提升应用的性能和可靠性。
通过以上内容,我们对利用 SQLAlchemy 进行数据库操作以及结合 Flask 开发 Web 应用有了更全面的了解,希望大家能够将这些知识应用到实际项目中,开发出更加优秀的 Web 应用。
超级会员免费看

1165

被折叠的 条评论
为什么被折叠?



