
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 Flaskimport osimport pymysqlapp = 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)
:长度限制的字符串。Date
和DateTime
:日期和日期时间类型。
一、Flask-SQLAlchemy 的使用
使用 Flask-SQLAlchemy 进行数据库操作通常包括以下步骤:
1.3 DDL (数据定义语言)操作
-
通过命令行建表:
示例命令:
set FLASK_APP=app.pyflask db initflask db migrateflask db upgrade
-
通过代码建表:
from flask import Flaskfrom flask_sqlalchemy import SQLAlchemyclass 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)
-
模型:
Tag
和Article
: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 Managerfrom flask import Flaskapp = 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 进行数据库开发。关注关系映射的使用,以提高数据操作的效率。这些建议和实例可以帮助您快速上手数据库开发,提升开发效率。
发表评论
最新留言
能坚持,总会有不一样的收获!
[***.219.124.196]2025年04月29日 15时15分54秒
关于作者

喝酒易醉,品茶养心,人生如梦,品茶悟道,何以解忧?唯有杜康!
-- 愿君每日到此一游!
推荐文章
PDF.js —— vue项目中使用pdf.js显示pdf文件(流)
2019-03-07
我用wxPython搭建GUI量化系统之最小架构的运行
2019-03-07
我用wxPython搭建GUI量化系统之多只股票走势对比界面
2019-03-07
selenium+python之切换窗口
2019-03-07
重载和重写的区别:
2019-03-07
搭建Vue项目步骤
2019-03-07
账号转账演示事务
2019-03-07
idea创建工程时错误提醒的是architectCatalog=internal
2019-03-07
SpringBoot找不到@EnableRety注解
2019-03-07
简易计算器案例
2019-03-07
在Vue中使用样式——使用内联样式
2019-03-07
Explore Optimization
2019-03-07
Kali Linux 内网渗透教程 - ARP欺骗攻击 | 超详细
2019-03-07
2020Java程序设计基础(华东交通大学)章节测试免费满分答案
2019-03-07
小程序之wx:request(转)
2019-03-07
解决数据库报ORA-02289:序列不存在错误
2019-03-07
map[]和map.at()取值之间的区别
2019-03-08
成功解决升级virtualenv报错问题
2019-03-08