QLAlchemy是Python编程语言下的一款开源软件。提供了SQL工具包及对象关系映射(ORM)工具,使用MIT许可证发行。
SQLAlchemy“采用简单的Python语言,为高效和高性能的数据库访问设计,实现了完整的企业级持久模型”。SQLAlchemy的理念是,SQL数据库的量级和性能重要于对象集合;而对象集合的抽象又重要于表和行。
SQLAlchemy是flask的一款数据库连接插件
使用以下命令安装包文件
pip install pymysql
pip install flask-sqlalchemy
- 首先配置app的属性,利用app.config[‘SQLALCHEMY_DATABASE_URI’]配置好flaskapp,之后调用db=SQLAlachemy(app)连接数据库。
- 用户自定义类继承db.model就是一张表,使用db.Column来定义一个属性,可以使用db.create_all()来将类生成表放入数据库。
- db.session实现数据库会话,可以进行增,删,改操作,执行db.commit后提交修改。
- flask-sqlalchemy提供外键等定义,可以用类的思路实现连表等操作。(但是熟悉SQL的话还是写SQL顺畅,如果要写原生sql需要用engine连接,连接返回的对象有execute方法可以执行原生SQL)
- 连接有问题可以尝试用.formate或者直接改字符串,有时候用f"{}"会出错不知道为什么
- 推荐使用flask-migrate来管理数据库,键入指令flask db migrate/flask db upgrade对ORM定义的数据库修改进行更新。
from flask import Flask
from flask_sqlalchemy import SQLAlchemy
app = Flask(__name__)
# MySQL所在的主机名
HOSTNAME = ""
# MySQL监听的端口号,默认3306
PORT =
# 连接MySQL的用户名,读者用自己设置的
USERNAME = ""
# 连接MySQL的密码,读者用自己的
PASSWORD = ""
# MySQL上创建的数据库名称
DATABASE = ""
app.config['SQLALCHEMY_DATABASE_URI'] = f"mysql+pymysql://{USERNAME}:{PASSWORD}@{HOSTNAME}:{PORT}/{DATABASE}?charset=utf8mb4"
# 在app.config中设置好连接数据库的信息,
# 然后使用SQLAlchemy(app)创建一个db对象
# SQLAlchemy会自动读取app.config中连接数据库的信息
db = SQLAlchemy(app)
# ORM ---- 一个类对应一张表
class User(db.Model):
__tablename__ = "user"
id = db.Column(db.Integer, primary_key=True, autoincrement=True)
# varchar, null=0
username = db.Column(db.String(100), nullable=False)
password = db.Column(db.String(100), nullable=False)
email = db.Column(db.String(100))
signature = db.Column(db.String(100))
class Article(db.Model):
__tablename__ = "article"
id = db.Column(db.Integer, primary_key=True, autoincrement=True)
title = db.Column(db.String(200), nullable=False)
content = db.Column(db.Text, nullable=False)
# 添加作者的外键
author_id = db.Column(db.Integer, db.ForeignKey("user.id"))
# backref:会自动的给User模型添加一个articles的属性,用来获取文章列表
author = db.relationship("User", backref="articles")
# 这里用db.create_all(),以后可以使用flask-migrate自动生成迁移脚本
with app.app_context():
db.create_all()
@app.route('/')
def hello_world():
return 'Hello World!'
@app.route("/user/add")
def add_user():
# 1. 创建ORM对象
user = User(username="张三", password='1111')
# 2. 将ORM对象添加到db.session中
db.session.add(user)
# 3. 将db.session中的改变同步到数据库中
db.session.commit()
return "用户创建成功!"
@app.route("/user/query")
def query_user():
# 1. get查找:根据主键查找
# user = User.query.get(1)
# print(f"{user.id}: {user.username}-{user.password}")
# 2. filter_by查找
# Query:类数组
users = User.query.filter_by(username="张三")
for user in users:
print(user.username)
return "数据查找成功!"
@app.route("/user/update")
def update_user():
user = User.query.filter_by(username="张三").first()
user.password = "222222"
db.session.commit()
return "数据修改成功!"
@app.route('/user/delete')
def delete_user():
# 1. 查找
user = User.query.get(1)
# 2. 从db.session中删除
db.session.delete(user)
# 3. 将db.session中的修改,同步到数据库中
db.session.commit()
return "数据删除成功!"
@app.route("/article/add")
def article_add():
article1 = Article(title="Flask学习大纲", content="Flaskxxxx")
article1.author = User.query.get(2)
# 添加到session中
db.session.add(article1)
# 同步session中的数据到数据库中
db.session.commit()
return "文章添加成功!"
@app.route("/article/query")
def query_article():
user = User.query.get(2)
for article in user.articles:
print(article.title)
return "文章查找成功!"
if __name__ == '__main__':
app.run()