Flask-SQLAlchemy
flask用于orm操作表,一般使用flask- sqlalchemy .操作简单,易于上手。
1.安装
pip instal flask-sqlalchemy
2.配置信息
DB_USERNAME = 'root'
DB_PASSWORD = 123
DB_HOST = '127.0.0.1'
DB_PORT = 3306
DB_NAME = 'sql_learn'
DB_URI = "mysql+pymysql://%s:%s@%s:%s/%s?charset=utf8" % (
DB_USERNAME, DB_PASSWORD, DB_HOST, DB_PORT, DB_NAME
)
SQLALCHEMY_DATABASE_URI= DB_URI
SQLALCHEMY_TRACK_MODIFICATIONS = False
SQLALCHEMY_ECHO = True
SQLALCHEMY_POOL_TIMEOUT #连接超时时间
SQLALCHEMY_POOL_SIZE 数据库池大小,default =5
3.表的创建
from flask_sqlalchemy import SQLAlchemy
db = SQLAlchemy()
from exts import db
"""
以下表关系:
一个用户对应多篇文章(一对多)
一篇文章对应多个标签,一个标签对应多个文章(多对多)
"""
"""
一对一关系中,需要设置relationship中的uselist=Flase,其他数据库操作一样。
一对多关系中,外键设置在多的一方中,关系(relationship)可设置在任意一方。
多对多关系中,需建立关系表,设置 secondary=关系表
"""
class User (db.Model):
id = db.Column(db.Integer, primary_key=True , autoincrement=True )
username = db.Column(db.String(50 ))
email = db.Column(db.String(50 ))
article_tag_table = 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 ))
class Article (db.Model):
__tablename__ = 'article'
id = db.Column(db.Integer, primary_key=True , autoincrement=True )
title = db.Column(db.String(100 ))
content = db.Column(db.Text)
author_id = db.Column(db.Integer, db.ForeignKey('user.id' ))
author = db.relationship("User" , backref="articles" )
tags = db.relationship("Tag" , secondary=article_tag_table, backref='tags' )
class Tag (db.Model):
__tablename__ = 'tag'
id = db.Column(db.Integer, primary_key=True , autoincrement=True )
name = db.Column(db.String(50 ))
Tags表与Article通过第三张表建立多对多关系,通过Article表中tags字段(relationship方法),建立多对多关系:
secondary 多对多关联类
cascade:设置级联关系。 删除可用delete,delete-orphan
single_parent:让级联关机支持多对多
passive_deletes :支持关联(被动)删除
tags = db.relationship("Tag" , secondary=article_tag_table, backref='tags' ,cascade="delete, delete-orphan" , single_parent=True , passive_deletes=True )
Integer 整型
String 字符串
Text 文本
DateTime 日期
Float 浮点型
Boolean 布尔值
PickleType 存储一个序列化Pickle 后对象。
4.数据库迁移
from flask import Flask
from flask_migrate import Migrate, MigrateCommand
from flask_script import Manager
import config
from exts import db
app = Flask(__name__)
app.config.from_object(config)
db.init_app(app)
manager = Manager(app)
Migrate(app,db)
manager.add_command("db" ,MigrateCommand)
if __name__ == '__main__' :
manager.run()
数据库手动创建库。这里我命名的库名sql_learn,在Terminal终端执行命令:
python3 manage.py db init
python3 manage.py db migrate
python3 manage.py db upgrade
python manage.py db history
python manage.py db downgrade 6af28765840d
5.单一的增删改查
user = User(id =1 ,username="ming" ,email="123@163.com" )
db.session.add(user)
db.session.commit()
user = User.query.filter (User.username=="ming" ).first()
user.email = "abc@163.com"
db.session.commit()
db.session.query(User).filter_by(username="Limong" ).update({"email" :"8888@163.com" })
User.query.filter (User.username == 'ming' ).update({'email' : 'ABC@163.com' })
db.session.commit()
User.query.filter (User.username == "ming" ).delete()
db.session.commit()
result = User.query.all ()
print (result)
result = User.query.get(1 )
result = User.query.filter_by(username="ming" ).first()
result = User.query.filter (and_(User.username=='name' , User.email=='passwd' )).all ()
User.query.filter (User.id .__lt__(5 )).all ()
User.query.filter (User.id .__le__(5 ))
User.query.filter (User.id .__gt__(5 ))
User.query.filter (User.id .__ge__(5 ))
User.query.filter (User.id .in_([1 ,2 ,3 ,4 ,5 ])).all ()
result = User.query.order_by("id" ).all ()
result = User.query.filter (User.id .__gt__(2 )).offset(2 ).limit(3 )
6.一对多关系
6.1数据增加
create_obj = db.session.query(User).filter (User.username=="xu" ).first()
article = Article(
title="python基础" ,
author_id=create_obj.id ,
content = "python入门,变量,函数,面向对象..."
)
db.session.add(article)
db.session.commit()
create_obj = Article(
title="python基础2" ,
content="python中生成器,迭代器..." ,
author=User(username="wenfeng" ,email="123@163.com" )
)
db.session.add(create_obj)
db.session.commit()
create_obj = User(username = "sun" ,email="123@163.com" )
create_obj.articles = [
Article(title="python进阶1" ,content="内存管理机制" ),
Article(title="python进阶2" ,content="垃圾回收机制" )
]
db.session.add(create_obj)
db.session.commit()
db.session.close ()
6.2数据查询
article_list = db.session.query(Article).all ()
for row in article_list:
print (row.title,row.content,row.author.username,row.author.email)
user_list = db.session.query(User).all ()
for row in user_list:
for row2 in row.articles:
print (row.username,row2.title)
6.3.更新数据
user_obj = db.session.query(User).filter (User.username == "xu" ).first()
db.session.query(Article).filter (Article.author_id == user_obj.id ).update({"title" :"vue基础" })
db.session.commit()
6.4删除数据
user_obj = db.session.query(User).filter (User.username=="xu" ).first()
db.session.query(Article).filter (Article.author_id == user_obj.id ).delete()
db.session.commit()
7.多对多关系
7.1基于relationship增加数据
article_obj = Article(title="Go基础" ,content="go语言指针。。。" )
article_obj.tags = [Tag(name="编译型语言" ),Tag(name="支持协程" ),Tag(name="非常快" )]
db.session.add(article_obj)
db.session.commit()
db.session.close()
7.2基于relationship查询数据
article_obj = db.session.query(Article).all ()
for row in article_obj:
for row2 in row.tags:
print (row.title,row2.name)
tag_obj = db.session.query(Tag).all ()
for row in tag_obj:
for row2 in row.tags:
print (row.name,row2.title)
7.3删除数据
article_obj = Article.query.filter (Article.title =="Go基础" ).first()
tag = Tag.query.filter (Tag.name == "非常快" ).first()
article_obj.tags.remove(tag)
db.session.commit()
article_obj = Article.query.filter (Article.title =="Go基础" ).first()
tags = Tag.query.join(article_tag_table).join(Article).filter (Article.title =="Go基础" ).all ()
for t in tags:
article_obj.tags.remove(t)
db.session.delete(article_obj)
db.session.commit()
db.session.close()
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· Linux系列:如何用 C#调用 C方法造成内存泄露
· AI与.NET技术实操系列(二):开始使用ML.NET
· 记一次.NET内存居高不下排查解决与启示
· 探究高空视频全景AR技术的实现原理
· 理解Rust引用及其生命周期标识(上)
· 物流快递公司核心技术能力-地址解析分单基础技术分享
· .NET 10首个预览版发布:重大改进与新特性概览!
· 单线程的Redis速度为什么快?
· 展开说说关于C#中ORM框架的用法!
· Pantheons:用 TypeScript 打造主流大模型对话的一站式集成库