先来一波干货
1.创建数据表
定义类:类下需要__tablename__来定义表的名称
常用字段类型:
Integer 整型
Float 浮点型
String 字符串类型
Time 时间类型 时分秒
DateTime 时间类型 年月日时分秒
Text 文本
解释及扩展:
Integer int 普通整数,一般是 32 位
SmallInteger int 取值范围小的整数,一般是 16 位
Big Integer int 或 long 不限制精度的整数
Float float 浮点数
Numeric decimal.Decimal 定点数
String str 变长字符串
Text str 变长字符串,对较长或不限长度的字符串做了优化
Unicode unicode 变长 Unicode 字符串
Unicode Text unicode 变长 Unicode 字符串,对较长或不限长度的字符串做了优化
Boolean bool 布尔值
Date datetime.date 日期
Time datetime.time 时间
DateTime datetime.datetime 日期和时间
Interval datetime.timedelta 时间间隔
Enum str 一组字符串
PickleType 任何 Python 对象 自动使用 Pickle 序列化
LargeBinary str 二进制文件
字段常用的参数:
Primary_key 主键
Unique 不重复
Index 索引
Nullable 如果为True是可以为空
Default 默认值
Autoincrement 自增长
数据表字段与关系:
一对一
在一个表里记录另一个表的字段
上面就是一些关于flask利用SQLAlchemy进行建模操作的参考
下面我们进行增删改查操作,在此之前,我先把用于演示的模型给大家配好:
class Classify(db.Model):
__tablename__ = 'classify'
id = db.Column(db.Integer, primary_key=True)
uid = db.Column(db.String(128), default=uuid.uuid4, nullable=False, unique=True)
name = db.Column(db.String(64), nullable=False)
code = db.Column(db.String(32))
desc = db.Column(db.String(256))
is_valid = db.Column(db.Boolean, default=True)
reorder = db.Column(db.Integer, default=0)
created_at = db.Column(db.DateTime)
updated_at = db.Column(db.DateTime)
img = db.Column(db.String(256))
parent_id = db.Column(db.Integer,db.ForeignKey('classify.id'))
def __str__(self):
return self.name
product_classify = db.Table('product_classify',db.Column('product_id',db.Integer,db.ForeignKey('product.id'),primary_key=True),
db.Column('classify_id',db.Integer,db.ForeignKey('classify.id'),primary_key=True))
class Product(db.Model):
__tablename__ = 'product'
id = db.Column(db.Integer, primary_key=True)
uid = db.Column(db.String(128), default=uuid.uuid4, nullable=False, unique=True)
name = db.Column(db.String(128), nullable=False)
status = db.Column(db.String(10),nullable=False)
content = db.Column(db.TEXT,nullable=False)
desc = db.Column(db.String(256))
types = db.Column(db.String(10),nullable=False)
price = db.Column(db.Integer,nullable=False)
origin = db.Column(db.Float)
img = db.Column(db.String(256),nullable=False)
channel = db.Column(db.String(32))
buy_link = db.Column(db.String(256))
sku_count = db.Column(db.Integer,default=0)
remain_count = db.Column(db.Integer,default=0)
view_count = db.Column(db.Integer,default=0)
score = db.Column(db.Float,default=10)
is_valid = db.Column(db.Boolean, default=True)
reorder = db.Column(db.Integer, default=0)
created_at = db.Column(db.DateTime,default=datetime.now)
updated_at = db.Column(db.DateTime,default=datetime.now,onupdate=datetime.now)
classify = db.relationship('Classify',secondary=product_classify,backref=db.backref('cls_product'))
tag = db.relationship('Tag',secondary=tag_classify,backref=db.backref('tag_product'))
稍微解释一下模型,我建立了三个,一个商品模型,一个分类模型,一个作用于多丢多的中间关系模型,这个多对多的关系模型与上图多对多关系表的参考图片虽然书写方式不同,但作用几乎是一样的,大家做一个了解
接下来就到了增删改查的环节,再来一波干货:
查询的关键字 描述 案例
all 查询返回的所有的结果 Product.query.all()
first 查询返回的第一个结果 Product.query.first()
filter 全局查询 Product.query.filter(Product.id=1).first()
filter_by 过滤器,条件查询 Product.query.filter_by(id= 18).all()
order_by 排序查询 Product.query.order_by(“id”).all() 升序
Product.query.order_by(models.desc(“id”)).all() 降序
get 以主键查询 Product.query.get(4)
offset 偏移量,从哪里开始 Product.query.offset(1).limit(2).all()
first_or_404 有记录则查询,无则抛404 Product.query.first_or_404()
get_or_404 有记录则查询,无则抛404 Product.query.first_or_404()
one 查询仅允许一条记录,否则报错 Product.query.one()
count 查询记录的条数 Product.query.all().count()
还有类似于paginate和group_by等查询这里就不说了
上面这些都是一些常用的单表查询
增:
p = Product(name=‘haha’)
db.session.add§
db.session.commit()
删:
p = Product.query.get(1)
db.session.delete§
db.session.commit()
改:
p = Product.query.get(1)
p.name = ‘hehehe’
db.session.add§
db.session.commit()
那么多对多,一对多关系呢?
这个其实也很简单,接下来就用实际操作来演示一下:
多对多关系的
增:
@mall.route('/prod/add',methods=['GET','POST'])
def prod_add():
form = ProductForm()
form.classify.choices = [(v.id,v.name) for v in Classify.query.all()] #这一段是为表单添加多选choices的
if form.validate_on_submit(): 这一段是做表单验证的
print(form.data)
prod_obj = Product( #这一段是做一个数据插入
name=form.data['name'],
status=form.data['status'],
content=form.data['content'],
desc=form.data['desc'],
types=form.data['types'],
price=form.data['price'],
origin=form.data['origin'],
img='xxx/abc.jpg', #图片插入目前先简单填充,后面再讲
channel=form.data['channel'],
buy_link=form.data['buy_link'],
sku_count=form.data['sku_count'],
remain_count=form.data['remain_count'],
view_count=form.data['view_count'],
score=form.data['score'],
is_valid=form.data['is_valid'],
reorder=form.data['reorder'])
db.session.add(prod_obj)
db.session.commit() #然后保存信息插入
for c_id in form.data['classify']: #这一步开始处理分类信息的多对多插入
classify = Classify.query.get(c_id) #获得分类对象
prod_obj.classify.append(classify) #多对多关系添加
flash('商品添加成功','success')
return redirect(url_for('index'))
else:
print(form.errors)
flash('商品添加失败','warning')
return render_template('prod_add.html', form=form)
删:
prod_obj.classify.remove(classify)
查:
for cls in prod_obj.classify:
print(cls.name)
改:
查出来再改咯,自己写
多对多的增删改查到这里了
一对多的增删改查呢?
查:
一般来讲,会在主表放一个relationship,关联外键表
prod_obj.关联外键表的relationship字段.name
查询外键表的名称字段
其他的操作就和常规操作没两样了
行了,就暂时说到这了