ORM框架之SQLAlchemy以及封装后的flask_sqlalchemy

什么是ORM
即Object-Relationl Mapping,它的作用是在关系型数据库和对象之间作一个映射,这样,我们在具体的操作数据库的时候,就不需要再去和复杂的SQL语句打交道,只要像平时操作对象一样操作它就可以了 。
什么是SQLAchemy
:Python编程语言下的一款ORM框架,将对象转换为SQL,然后使用数据API执行SQL并获取执行结果。以下两图可大致说明其工作方式
在这里插入图片描述
DB-API是Python的数据库接口规范
在这里插入图片描述
sqlalchemy的组成部分(可不做了解):
  – engine,框架的引擎
  – connection pooling 数据库连接池
  – Dialect 选择链接数据库的DB-API种类(实际选择哪个模块链接数据库)
  – Schema/Types 架构和类型
  – SQL Expression Language SQL表达式语言
1.链接数据库,并创建模型

from sqlalchemy import create_engine
DB_URI = 'mysql+pymysql://{}:{}@{}:{}/{}?charset=utf8'.format(USERNAME,PASSWORD,HOSTNAME,PORT,DATABA#数据库配置变量
engine = create_engine(DB_URI)#创建引擎
Base = declarative_base(engine)#根据引擎创建一个基类
class Person(Base):#创建模型映射到数据库,模型的创建必须继承于Base基类
    __tablename__ = 'person' #指定数据库的表名
    以下加字段
Base.metadata.drop_all() #修改字段类型等不能更新需要先把原来的 drop掉
Base.metadata.create_all()#创建表格

2.数据库的增删改查

#对数据库增删该查 都是通过一个session对象
session = sessionmaker(engine)()#sessionmaker(engine) 这是一个类,后面加括号才能成为对象
def delete_data():
    person = session.query(Person).first()
    session.delete(person)#delete_all()  为全部
    session.commit()#执行后必须提交

articles = session.query(Article).all()#查询所有,可以遍历打印
articles = session.query(Article.price).all()#只显示某个字段的所有数据
result = session.query(func.count(Article.id)).first()
print(result)#聚合函数的使用,包括(avg、max、min、count、sum、)但是必须导入func
条件查询: 
res = session.query(Article).filter(Article.id==1)*或者filter_by(id=1)*.first()#相等直接用=
filter(Article.title.notin_(['title20','title99']))#like、in、not in、and、or括号内接条件,使用有各自的语法

Column常用参数

  1. default 1~4 与sql中大差不差
  2. nullable
  3. primary_key
  4. autoincrement
  5. onupdate :更新的时候执行的函数egupdate_time = Column(DateTime,onupdate=datetime.now,default=datetime.now)
  6. name:改属性在数据库中的字段映射egtitle = Column(String(50),nullable=False,name='my_title')在表中为’my_title’
    sqlalchemy常用数据类型
    同sql相似,写法不同,会多一个“text”以及“longtext”类型

flask_sqlalchemy
Flask-SQLAlchemy是对SQLAlchemy进行了一个简单的封装,使得我们在flask中使用sqlalchemy更加的简单

#导包量减少,书写简便,三行即可初始化数据库
from flask import Flask
from flask_sqlalchemy import SQLAlchemy
from constants import DB_URI
app = Flask(__name__)
app.config['SQLALCHEMY_DATABASE_URI'] = DB_URI
db = SQLAlchemy(app)

创建表格前直接省略了创建基类,直接调用db.Model属性,且session成为db的一个属性,不用再make_session实例化后再使用

class UserModel(db.Model):
    __tablename__ = 'users'
    id = db.Column(db.Integer,primary_key=True,autoincrement=True)
    username = db.Column(db.String(50),nullable=False)
    .
    .
db.session.add()#添加后提交
db.session.commit()

Flask-Migrate

了解flask_migrate需要先了解flask-script,那么flask-script的作用是什么呢?flask-script的作用是可以通过命令行的形式来操作Flask。例如通过命令跑一个开发版本的服务器、设置数据库,定时任务等。

from flask_script import Manager
from flask_migrate import Migrate,MigrateCommand#导入 Migrate,MigrateCommand
from app import app,db
manager =Manager(app)
Migrate(app,db)  #要让Flask-Migrate能够管理app中的数据库,需要使用Migrate(app,db)来绑定`app`和数据库
manager.add_command("db",MigrateCommand)#创建命令   "db"这个可以随便起名,初始化迁移文件夹的时候,终端要一致
python manage.py db init#初始化迁移文件夹,执行一次就可以了
python manage.py db migrate#模型迁移到目录中
python manage.py db upgrade#映射到数据库
#若要使用
flask db init 
需要先执行FLASK_APP='your_app.py'

映射完成后就是表格的增删改查,此时已经不再需要全部删除再改了

users = User.query.filter(User.id==1).first()
db.session.delete(users)#删除
db.session.commit()#仍然别忘记提交
  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
Flask-SQLAlchemy是一个轻量级的ORM(对象关系映射)库,用于将Python对象映射到SQL数据库表上,使得在Flask应用中操作数据库变得更加简单。在前后端分离的Flask应用中,它通常用于处理数据层逻辑,包括模型定义、数据库操作和与后端API的交互。 以下是使用Flask-SQLAlchemy的基本步骤,假设我们有一个简单的用户模型: 1. 安装Flask-SQLAlchemy: ```bash pip install Flask-SQLAlchemy ``` 2. 在Flask应用初始化文件(如`app.py`)中设置配置: ```python from flask import Flask from flask_sqlalchemy import SQLAlchemy app = Flask(__name__) app.config['SQLALCHEMY_DATABASE_URI'] = 'your_database_connection_string' db = SQLAlchemy(app) ``` 这里你需要替换`your_database_connection_string`为你实际的数据库连接字符串。 3. 定义数据库模型(User模型): ```python class User(db.Model): id = db.Column(db.Integer, primary_key=True) username = db.Column(db.String(80), unique=True, nullable=False) email = db.Column(db.String(120), unique=True, nullable=False) def __repr__(self): return f'<User {self.username}>' ``` 4. 创建数据库表(如果表不存在): ```python with app.app_context(): db.create_all() ``` 5. 后端API的路由和CRUD操作: ```python @app.route('/users', methods=['GET']) def get_users(): users = User.query.all() return {'users': [u.to_dict() for u in users]} @app.route('/users/<int:user_id>', methods=['GET']) def get_user(user_id): user = User.query.get_or_404(user_id) return {'user': user.to_dict()} # ...其他增删改查操作 ``` 这里的`to_dict()`方法用于将数据库对象转换为字典以便序列化返回给前端。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值