赞
踩
ORM(Object Relational Mapping)被称为对象关系映射,它把一个类映射成数据库里的一张表而属性映射成数据库表的列,每一个实例对象对应数据库表里的一行数据。
pip install flask-sqlalchemy
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:///文件名 |
字段名 | 类型 | 说明 |
---|---|---|
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()
待补充查询操作。。。
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。