Flask的ORM详细使用说明

ORM

ORM(Object Relational Mapping)被称为对象关系映射,它把一个类映射成数据库里的一张表而属性映射成数据库表的列,每一个实例对象对应数据库表里的一行数据。

安装Flask-SQLAlchemy

pip install flask-sqlalchemy

创建model

from flask import Flask
from flask_sqlalchemy import SQLAlchemy

app = Flask(__name__)
app.config["SQLALCHEMY_DATABASE_URI"] = "sqlite:///test.db"

db = SQLAlchemy(app)


class Category(db.Model):
    __tablename__ = "t_category"
    id = db.Column(db.Integer, primary_key=True)
    name = db.Column(db.String(50))

db.create_all()

__tablename__属性定义表名,默认为类名,__tablename_zh__表示表结构的中文名。
__table_desc__属性定义表描述内容。
db.create_all()用于创建所有表结构。

数据库连接

SQLALCHEMY_DATABASE_URI定义需要连接的数据库信息,常用的其他数据库配置:

数据库 连接地址
MySQL mysql+pymysql://用户名:密码@主机:3306/数据库名
SQL mssql+pymssql://用户名:密码@主机:端口/数据库名
Oracle oracle+cx_oracle://用户名:密码@主机:1521/SID名
SQLite sqlite:///文件名
Model字段的创建数据类型
字段名 类型 说明
Integer int 普通整数,一般是32位
SmallInteger int 取值范围小的整数,一般是 16 位
BigInteger int 或 long 不限制精度的整数
Float float 浮点数
Double float 双精度浮点数
Numeric decimal.Decimal 定点数(默认decimal.Decimal,asdecimal=False时转float)
String string 变长字符串
Text string 编程字符串,对较长或不限长度的字符串做了优化,用于长文本
Boolean bool 布尔值
Date datetime.date 仅日期
Time datetime.time 仅时间
DateTime datetime.datetime 日期和时间
Interval datetime.timedelta 时间间隔
Enum Enum 枚举类型
ARRAY array 数组
PickType 任何python对象 自动使用 Pickle 序列化
Unicode unicode 变长 Unicode 字符串
UnicodeText unicode 变长 Unicode 字符串,对较长或不限长度的字符串做了优化
LargeBinary binary 大型二进制字节数据
字段描述的可选添加选项
属性 说明
primary_key 主键
default 默认值
unique 是否唯一
nullable 是否允许为空
index 是否添加为索引
autoincrement 自增
comment 注释
一对多关系
class Post(db.Model):
  id = db.Column(db.Integer(),primary_key=True)
    title = db.Column(db.String(255))
  text = db.Column(db.Text())
  publish_date = db.Column(db.DateTime())
  user_id = db.Column(db.Integer(),db.ForeignKey('user.id'))


class User(db.Model):
  id = db.Column(db.Integer(),primary_key=True)
  username = db.Column(db.String(255))
  password = db.Column(db.String(255))
  posts = db.relationship('Post',backref='user',lazy='dynamic')

注意
1、 传给db.ForeignKey的参数,是一个用来代表user表id列的字符串,如果user表中用__tablename__自定义表名,则需要用自定义的表名
2、 “多”的一方写ForeignKey,可以通过表名.(“一”的一方的backref)对“一”的一方进行读取和修改。relationship可以在任意一方,一般是在“一”的一方。

lazy关键字说明:lazy 决定了 SQLAlchemy 什么时候从数据库中加载数据。
可选值:
select:(默认)当读取到对象的属性时,就会全部加载所有属性。
dynamic:返回一个query对象,只有当执行对象的方法时,才会加载所有数据。如:all()
joined:在对关联的两个表进行join操作,从而获取到所有相关的对象

多对多关系
t_user_role = db.Table("t_user_role",
    db.Column("user_id", db.Integer, db.ForeignKey("t_user.id"), primary_key=True),
    db.Column("role_id", db.Integer, db.ForeignKey("t_role.id"), primary_key=True)
)


class User(db.Model):
    __tablename__ = "t_user"
    id = db.Column(db.Integer, primary_key=True)
    name = db.Column(db.String(15))
    roles = db.relationship("Role", backref="users", secondary=t_user_role)


class Role(db.Model):
    __tablename__ = "t_role"
    id = db.Column(db.Integer, primary_key=True)
    name = db.Column(db.String(15))

新增

u = User(name="张三")
db.session.add(u)

# 对于多对对关系
r1 = Role(name="Admin")
r2 = Role(name="User")
db.session.add(r1)
db.session.add(r2)
u.roles = [r1,r2]
db.session.add(u)

# 也可以使用这个方式
u.roles.append(r1)
u.roles.append(r2)
db.session.commit()
删除
c = Category.query.get(1)
db.session.delete(c)
批量删除
# 方法一
posts = Posts.query.filter(User.user_id ==1).all()
for p in posts:
	db.session.delete(p)
db.session.commit()

#方法二
Posts.query.filter(User.user_id==1).delete(synchronize_session=False)
db.session.commit()

以上的删除操作均为逻辑删除,慎重执行删除!

修改
p = Posts.query.get(1)
p.title = "Python"
db.session.add(p)
db.session.commit()

待补充查询操作。。。

猜你喜欢

转载自blog.csdn.net/qq_42349944/article/details/130487557