当前位置:   article > 正文

Flask的ORM详细使用说明_flask中orm操作

flask中orm操作
ORM

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

安装Flask-SQLAlchemy
pip install flask-sqlalchemy
  • 1
创建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()
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15

__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
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13

注意
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))
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
新增
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()
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
删除
c = Category.query.get(1)
db.session.delete(c)
  • 1
  • 2
批量删除
# 方法一
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()
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9

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

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

待补充查询操作。。。

声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/笔触狂放9/article/detail/521952
推荐阅读
相关标签
  

闽ICP备14008679号