33、利用 SQLAlchemy 进行数据库操作及结合 Flask 开发 Web 应用

利用 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()
  1. 添加新对象并提交更改:
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 应用。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值