flaskSQLalchemy和flask_scrip使用
发布日期:2021-05-14 12:21:30 浏览次数:15 分类:精选文章

本文共 4848 字,大约阅读时间需要 16 分钟。

Flask + Pymysql 操作 MySQL 示例

一、Flask + Pymysql 操作 MySQL 示例

在本节中,我将详细介绍如何使用 Flask 框架与 Pymysql 进行数据库操作。由于 MySQL 常被用于存储应用程序的数据,我们需要了解如何通过 Flask 和 Pymysql 连接并操作数据库。

1.1 连接数据库

首先,我们需要确保 Pymysql 已经安装并可以连接到数据库。以下是配置数据库连接的步骤:

from flask import Flask
import os
import pymysql
app = Flask(__name__)
app.config["SECRET_KEY"] = os.urandom(24)
# 确保 pymysql 可以访问字典
pymysql.installilikend("py36")
class DB:
def __init__(self):
self.conn = pymysql.connect(**{
"host": "localhost",
"user": "root",
"password": "password",
"port": 3306,
"database": "db",
"charset": "utf8mb4"
})
self.cursor = self.conn.cursor()
def query(self, sql):
self.cursor.execute(sql)
return self.cursor.fetchall()
def close(self):
self.conn.close()
@app.route("/")
def index():
sql = "SELECT * FROM t_book WHERE bookName = 'python';"
r = DB().query(sql)
if len(r) != 0:
return "数据库有数据"
return "数据库为空"
if __name__ == "__main__":
app.run(debug=True)
1.2 ORM 与 Flask-SQLAlchemy

在 Flask 开发中,使用 ORM 可以简化数据库操作。以下介绍 Flask-SQLAlchemy 的基本知识及其应用:

1.2.1 ORM 简介
  • ORM (Object Relationship Mapping):将数据库表映射为对象,使用 Object 类操作数据,支持面向对象编程。
  • 优点:
    • 元编程:通过类操作数据库。
    • 将表结构抽象为类,数据映射为对象。
1.2.2 Flask-SQLAlchemy 简介

Flask-SQLAlchemy 是一个用于简化 Flask ORM 的库。以下是其常用配置和功能:

  • 常用配置参数:

    • SQLALCHEMY_DATABASE_URI:定义数据库连接字符串。
    • SQLALCHEMY_TRACK_MODIFICATIONS:默认为 True,跟踪对象修改并发送信号。
    • SQLALCHEMY_POOL_SIZE:数据库连接池的大小,默认为 5。
  • 常用数据类型:

    • Integer:整数类型。
    • Float:浮点数。
    • String(80):长度限制的字符串。
    • DateDateTime:日期和日期时间类型。

一、Flask-SQLAlchemy 的使用

使用 Flask-SQLAlchemy 进行数据库操作通常包括以下步骤:

1.3 DDL (数据定义语言)操作
  • 通过命令行建表:

    示例命令:

    set FLASK_APP=app.py
    flask db init
    flask db migrate
    flask db upgrade
  • 通过代码建表:

    from flask import Flask
    from flask_sqlalchemy import SQLAlchemy
    class User(db.Model):
    id = db.Column(db.Integer, primary_key=True)
    username = db.Column(db.String(80), unique=True)
    email = db.Column(db.String(120), unique=True)
##### 1.4 DML (数据操作语言)操作
- **插入数据**:
```python
user = User(username='lisi')
db.session.add(user)
db.session.commit()
  • 查询数据:

    user = User.query.filter(User.username == 'lisi').first()
  • 更新数据:

    user = User.query.get(1)
    user.username = 'weliu'
    db.session.commit()
  • 删除数据:

    user = User.query.get(1)
    db.session.delete(user)
    db.session.commit()
1.5 原生 SQL 运算

有时候,直接使用 SQL 可能是必要的。以下是一个使用原生 SQL 查询的示例:

cursor = db.session.execute("SELECT username FROM user")
data = cursor.fetchall()
1.6 关系映射(One-to-Many 和 Many-to-Many)
1.6.1 一对多关系
  • 模型一:User:

    class User(db.Model):
    id = db.Column(db.Integer, primary_key=True)
    username = db.Column(db.String(80), unique=True)
    articles = db.relationship('Article', backref='user')
  • 模型二:Article:

    class Article(db.Model):
    id = db.Column(db.Integer, primary_key=True)
    title = db.Column(db.String(100), nullable=False)
    user_id = db.Column(db.Integer, db.ForeignKey('user.id'))
1.6.2 多对多关系
  • 需要创建中间表:

    article_tag = db.Table('article_tag',
    db.Column('article_id', db.Integer, db.ForeignKey('article.id'), primary_key=True),
    db.Column('tag_id', db.Integer, db.ForeignKey('tag.id'), primary_key=True)
  • 模型:TagArticle:

    class Tag(db.Model):
    id = db.Column(db.Integer, primary_key=True)
    name = db.Column(db.String(64), nullable=False)
    articles = db.relationship('ArticleTag', backref='tags')
    class Article(db.Model):
    id = db.Column(db.Integer, primary_key=True)
    title = db.Column(db.String(128), nullable=False)
    tags = db.relationship('ArticleTag', backref='articles')
1.6.3 自引用(Self-Referencing Relationships)
  • 通常用于表示用户可以给文章或评论打分:

    class Comment(db.Model):
    id = db.Column(db.Integer, primary_key=True)
    content = db.Column(db.Text)
    rating = db.Column(db.Float, default=0)
    user_id = db.Column(db.Integer, db.ForeignKey('user.id'))
    commented_article_id = db.Column(db.Integer, db.ForeignKey('article.id'))
1.6.4 多对多关联查询
  • 查询所有文章和标签的关系:

    data = db.session.query(Article, Tag).filter(Article.id == Tag.id).all()

二、Flask-Script 的使用

2.1 简单命令
  • 创建命令并附加到 Flask-Script:

    from flask_script import Manager
    from flask import Flask
    app = Flask(__name__)
    manager = Manager(app)
    @manager.command("runserver")
    def runserver():
    print("服务器已经启动!")
    if __name__ == '__main__':
    manager.run()

-运行命令:

python app.py runserver
2.2 子命令
  • 创建子命令:

    from flask_script import Manager
    @manager.command("initdb")
    def initdb():
    print("初始化数据库!")
    # 使用子命令:
    python app.py initdb
- 完整示例:
```python
from flask import Flask
from flask_sqlalchemy import SQLAlchemy
import config
app = Flask(__name__)
db.init_app(app)
@manager.command("migrate")
def migrate():
db.create_all()
if __name__ == '__main__':
manager.run()

三、总结

通过此文档,您应该能够通过 Flask 和 Pymysql 进行数据库操作。了解 ORM 的优势,并尽量使用 Flask-SQLAlchemy 进行数据库开发。关注关系映射的使用,以提高数据操作的效率。这些建议和实例可以帮助您快速上手数据库开发,提升开发效率。

上一篇:Flask--核心实现
下一篇:flask模板--表单验证

发表评论

最新留言

能坚持,总会有不一样的收获!
[***.219.124.196]2025年04月29日 15时15分54秒