ORM

ORM 全拼Object Relational Mapping

中文意为 对象-关系映射

优点 :

  只需要面向对象编程, 不需要面向数据库编写代码.

  对数据库的操作都转化成对类属性和方法的操作.

  不用编写各种数据库的sql语句.

  实现了数据模型与数据库的解耦, 屏蔽了不同数据库操作上的差异.

  不在关注用的是mysqloracle...等.

  通过简单的配置就可以轻松更换数据库, 而不需要修改代码.

缺点 :

  相比较直接使用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()
复制代码

 

 

posted on   今晚不吃饭  阅读(142)  评论(0编辑  收藏  举报
相关博文:
阅读排行:
· 无需6万激活码!GitHub神秘组织3小时极速复刻Manus,手把手教你使用OpenManus搭建本
· C#/.NET/.NET Core优秀项目和框架2025年2月简报
· Manus爆火,是硬核还是营销?
· 终于写完轮子一部分:tcp代理 了,记录一下
· 【杭电多校比赛记录】2025“钉耙编程”中国大学生算法设计春季联赛(1)



点击右上角即可分享
微信分享提示