Flask-SQLAlchemy使用

Flask-SQLAlchemy 使用起来非常有趣,对于基本应用十分容易使用,并且对于大型项目易于扩展。
官方文档:https://flask-sqlalchemy.palletsprojects.com/en/2.x/
中文文档:http://www.pythondoc.com/flask-sqlalchemy/

安装

pip install flask-sqlalchemy

配置

配置选项 说明
SQLALCHEMY_DATABASE_URI 连接数据库。示例:mysql://username:password@host/post/db?charset=utf-8
SQLALCHEMY_BINDS 一个将会绑定多种数据库的字典。 更多详细信息请看官文 绑定多种数据库.
SQLALCHEMY_ECHO 调试设置为true
SQLALCHEMY_POOL_SIZE 数据库池的大小,默认值为5。
SQLALCHEMY_POOL_TIMEOUT 连接超时时间
SQLALCHEMY_POOL_RECYCLE 自动回收连接的秒数。
SQLALCHEMY_MAX_OVERFLOW 控制在连接池达到最大值后可以创建的连接数。当这些额外的连接回收到连接池后将会被断开和抛弃。
SQLALCHEMY_TRACK_MODIFICATIONS 如果设置成 True (默认情况),Flask-SQLAlchemy 将会追踪对象的修改并且发送信号。这需要额外的内存, 如果不必要的可以禁用它。

创建及查询

from flask import Flask
from flask_sqlalchemy import SQLAlchemy


app = Flask(name)

app.config['SQLALCHEMY_DATABASE_URI'] = 'sqlite:////tmp/test.db'

db = SQLAlchemy(app)




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)



<span class="hljs-function"><span class="hljs-keyword">def</span> <span class="hljs-title">__init__</span>(<span class="hljs-params">self, username, email</span>):</span>
    self.username = username
    self.email = email

<span class="hljs-function"><span class="hljs-keyword">def</span> <span class="hljs-title">__repr__</span>(<span class="hljs-params">self</span>):</span>
    <span class="hljs-keyword">return</span> <span class="hljs-string">'&lt;User %r&gt;'</span> % self.username


<span class="hljs-function"><span class="hljs-keyword">def</span> <span class="hljs-title">__init__</span>(<span class="hljs-params">self, username, email</span>):</span>
    self.username = username
    self.email = email

<span class="hljs-function"><span class="hljs-keyword">def</span> <span class="hljs-title">__repr__</span>(<span class="hljs-params">self</span>):</span>
    <span class="hljs-keyword">return</span> <span class="hljs-string">'&lt;User %r&gt;'</span> % self.username
if name == 'main':

# 创建初始数据

db.create_all()

# 创建一些用户

admin = User('admin', 'admin@example.com')

guest = User('guest', 'guest@example.com')

# 写入到数据库

db.session.add(admin)

db.session.add(guest)

db.session.commit()

# 访问数据库

users = User.query.all()

admin = User.query.filter_by(username='admin').first()

print(users)

print(admin)

结果:

[<User 'admin'>, <User 'guest'>]
<User 'admin'>

表关联

SQLAlchemy 连接到关系型数据库,关系型数据最擅长的东西就是关联。因此,我们将创建一个使用两张相互关联的表的应用作为例子:

from flask import Flask
from flask_sqlalchemy import SQLAlchemy
from datetime import datetime


app = Flask(name)

app.config['SQLALCHEMY_DATABASE_URI'] = 'sqlite:////tmp/test.db'

db = SQLAlchemy(app)




class Post(db.Model):

id = db.Column(db.Integer, primary_key=True)

title = db.Column(db.String(80), nullable=False)

body = db.Column(db.Text, nullable=False)

pub_date = db.Column(db.DateTime, nullable=False,

default=datetime.utcnow)



category_id = db.Column(db.Integer, db.ForeignKey(<span class="hljs-string">'category.id'</span>), <span class="hljs-comment"># 外键</span>
                        nullable=<span class="hljs-literal">False</span>)

<span class="hljs-comment"># 与生成表结构无关,仅用于查询方便</span>
<span class="hljs-comment"># backref 标示可通过relationship反向查找,Category.posts查询Post表数据</span>
category = db.relationship(<span class="hljs-string">'Category'</span>,
                           backref=db.backref(<span class="hljs-string">'posts'</span>, lazy=<span class="hljs-literal">True</span>))

<span class="hljs-function"><span class="hljs-keyword">def</span> <span class="hljs-title">__repr__</span>(<span class="hljs-params">self</span>):</span>
    <span class="hljs-keyword">return</span> <span class="hljs-string">'&lt;Post %r&gt;'</span> % self.title




class Category(db.Model):

id = db.Column(db.Integer, primary_key=True)

name = db.Column(db.String(50), nullable=False)



<span class="hljs-function"><span class="hljs-keyword">def</span> <span class="hljs-title">__repr__</span>(<span class="hljs-params">self</span>):</span>
    <span class="hljs-keyword">return</span> <span class="hljs-string">'&lt;Category %r&gt;'</span> % self.name




if name == 'main':

# 创建一些对象

py = Category(name='Python')

Post(title='Hello Python!', body='Python is pretty cool', category=py)

p = Post(title='Snakes', body='Ssssssss')

py.posts.append(p)

db.session.add(py)



<span class="hljs-comment"># 现在因为我们在 backref 中声明了 posts 作为动态关系,查询显示为:</span>
print(py.posts)


category_id = db.Column(db.Integer, db.ForeignKey(<span class="hljs-string">'category.id'</span>), <span class="hljs-comment"># 外键</span>
                        nullable=<span class="hljs-literal">False</span>)

<span class="hljs-comment"># 与生成表结构无关,仅用于查询方便</span>
<span class="hljs-comment"># backref 标示可通过relationship反向查找,Category.posts查询Post表数据</span>
category = db.relationship(<span class="hljs-string">'Category'</span>,
                           backref=db.backref(<span class="hljs-string">'posts'</span>, lazy=<span class="hljs-literal">True</span>))

<span class="hljs-function"><span class="hljs-keyword">def</span> <span class="hljs-title">__repr__</span>(<span class="hljs-params">self</span>):</span>
    <span class="hljs-keyword">return</span> <span class="hljs-string">'&lt;Post %r&gt;'</span> % self.title
<span class="hljs-function"><span class="hljs-keyword">def</span> <span class="hljs-title">__repr__</span>(<span class="hljs-params">self</span>):</span>
    <span class="hljs-keyword">return</span> <span class="hljs-string">'&lt;Category %r&gt;'</span> % self.name
<span class="hljs-comment"># 现在因为我们在 backref 中声明了 posts 作为动态关系,查询显示为:</span>
print(py.posts)

运行结果:

[<Post 'Hello Python!'>, <Post 'Snakes'>]

更多数据库的增删改查等功能参考官方文档:https://flask-sqlalchemy.palletsprojects.com/en/2.x/queries/

posted @   R-Bear  阅读(213)  评论(0编辑  收藏  举报
编辑推荐:
· Linux系列:如何用heaptrack跟踪.NET程序的非托管内存泄露
· 开发者必知的日志记录最佳实践
· SQL Server 2025 AI相关能力初探
· Linux系列:如何用 C#调用 C方法造成内存泄露
· AI与.NET技术实操系列(二):开始使用ML.NET
阅读排行:
· 无需6万激活码!GitHub神秘组织3小时极速复刻Manus,手把手教你使用OpenManus搭建本
· C#/.NET/.NET Core优秀项目和框架2025年2月简报
· 葡萄城 AI 搜索升级:DeepSeek 加持,客户体验更智能
· 什么是nginx的强缓存和协商缓存
· 一文读懂知识蒸馏
点击右上角即可分享
微信分享提示