ORM
ORM
全拼Object Relational Mapping
中文意为 对象-关系映射
优点 :
只需要面向对象编程, 不需要面向数据库编写代码.
对数据库的操作都转化成对类属性和方法的操作.
不用编写各种数据库的sql语句
.
实现了数据模型与数据库的解耦, 屏蔽了不同数据库操作上的差异.
不在关注用的是mysql
、oracle
...等.
通过简单的配置就可以轻松更换数据库, 而不需要修改代码.
缺点 :
相比较直接使用SQL语句操作数据库,有性能损失.
根据对象的操作转换成SQL语句,根据查询的结果转化成对象, 在映射过程中有性能损失.
Flask-SQLAlchemy
SQLALchemy实际上是对数据库的抽象,让开发者不用直接和 SQL 语句打交道,而是通过 Python 对象来操作数据库,在舍弃一些性能开销的同时,换来的是开发效率的较大提升
SQLAlchemy是一个关系型数据库框架,它提供了高层的 ORM 和底层的原生数据库的操作。flask-sqlalchemy 是一个简化了 SQLAlchemy 操作的flask扩展。
from flask import Flask from flask_sqlalchemy import SQLAlchemy app = Flask(__name__) # 初始化SQLAlchemy对象 db = SQLAlchemy(app)
@app.route('/') def hello_world(): return 'Hello World!' if __name__ == '__main__': app.run(debug=True)
当我们运行这部分代码后,会报了一堆错误,而错误原因是我们没有设置数据库连接。
设置数据库连接
app.config['SQLALCHEMY_DATABASE_URI'] = 'mysql://root:mysql@127.0.0.1:3306/test' #root代表用户名,mysql则是密码;127.0.0.1代表着主机名,3306则是mysql的默认端口号,test是要连接的数据库。 app.config['SQLALCHEMY_TRACK_MODIFICATIONS'] = False # 动态追踪修改设置,如未设置只会提示警告,会有额外开销,所以直接写False
Mysql
1 2 | show database; #查看所有数据库 create database 数据库名 character set utf8; #utf8字符编码#新建数据库 |
常用的SQLAlchemy字段类型
类型名 | python中类型 | 说明 |
---|---|---|
Integer | int | 普通整数,一般是32位 |
SmallInteger | int | 取值范围小的整数,一般是16位 |
BigInteger | int或long | 不限制精度的整数 |
Float | float | 浮点数 |
Numeric | decimal.Decimal | 普通整数,一般是32位 |
String | str | 变长字符串 |
Text | str | 变长字符串,对较长或不限长度的字符串做了优化 |
Unicode | unicode | 变长Unicode字符串 |
UnicodeText | unicode | 变长Unicode字符串,对较长或不限长度的字符串做了优化 |
Boolean | bool | 布尔值 |
Date | datetime.date | 时间 |
Time | datetime.datetime | 日期和时间 |
LargeBinary | str | 二进制文件 |
常用的SQLAlchemy列选项
选项名 | 说明 |
---|---|
primary_key | 如果为True,代表表的主键 |
unique | 如果为True,代表这列不允许出现重复的值 |
index | 如果为True,为这列创建索引,提高查询效率 |
nullable | 如果为True,允许有空值,如果为False,不允许有空值 |
default | 为这列定义默认值 |
Flask-SQLAlchemy增删改查
例:
from flask import Flask from flask_sqlalchemy import SQLAlchemy class Config: DEBUG = True SQLALCHEMY_DATABASE_URI = "mysql://root@127.0.0.1:3306/demo" SQLALCHEMY_TRACK_MODIFICATIONS = False app = Flask(__name__) app.config.from_object(Config) db = SQLAlchemy(app) # 模型类 -》对一个表设计 class User(db.Model): id = db.Column(db.Integer, primary_key=True) name = db.Column(db.String(64)) age = db.Column(db.Integer) @app.route("/", methods=["GET", "POST"]) def index(): # 增 方法1↓ 实例化 user = User(name="laowang", age=18) db.session.add(user) #方法2↓ #user = User() # user.name = "laozhang" # user.age = 20 # db.session.add(user) # 提交(很重要) db.session.commit() # 删 # res = User.query.filter_by(name="laowang").first() # db.session.delete(res) # db.session.commit() # print(res) # 查找↓改 #res = User.query.filter_by(id=3).first() #res.name="老色批" #db.session.commit() return "成功!" if __name__ == '__main__': db.create_all() app.run()
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 无需6万激活码!GitHub神秘组织3小时极速复刻Manus,手把手教你使用OpenManus搭建本
· C#/.NET/.NET Core优秀项目和框架2025年2月简报
· Manus爆火,是硬核还是营销?
· 终于写完轮子一部分:tcp代理 了,记录一下
· 【杭电多校比赛记录】2025“钉耙编程”中国大学生算法设计春季联赛(1)