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定义需要连接的数据库信息,常用的其他数据库配置:

数据库连接地址
MySQLmysql+pymysql://用户名:密码@主机:3306/数据库名
SQLmssql+pymssql://用户名:密码@主机:端口/数据库名
Oracleoracle+cx_oracle://用户名:密码@主机:1521/SID名
SQLitesqlite:///文件名
Model字段的创建数据类型
字段名类型说明
Integerint普通整数,一般是32位
SmallIntegerint取值范围小的整数,一般是 16 位
BigIntegerint 或 long不限制精度的整数
Floatfloat浮点数
Doublefloat双精度浮点数
Numericdecimal.Decimal定点数(默认decimal.Decimal,asdecimal=False时转float)
Stringstring变长字符串
Textstring编程字符串,对较长或不限长度的字符串做了优化,用于长文本
Booleanbool布尔值
Datedatetime.date仅日期
Timedatetime.time仅时间
DateTimedatetime.datetime日期和时间
Intervaldatetime.timedelta时间间隔
EnumEnum枚举类型
ARRAYarray数组
PickType任何python对象自动使用 Pickle 序列化
Unicodeunicode变长 Unicode 字符串
UnicodeTextunicode变长 Unicode 字符串,对较长或不限长度的字符串做了优化
LargeBinarybinary大型二进制字节数据
字段描述的可选添加选项
属性说明
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()

待补充查询操作。。。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值