flask学习笔记08

flask学习笔记08

ORM笔记

在实际项目中使用sql原生语句来编写属实费心费力,这时就要用到ORM了

它的优点是,易用,灵活且性能高。

不过DB_URL 还是要向下面这样编写。

from sqlalchemy import create_engine

HOSTNAME = '127.0.0.1'
POST = '3306'
DATABASE = 'mytest'
USERNAME = 'root'
PASSWORD = 'root'
DB_URL = f'mysql+pymysql://{USERNAME}:{PASSWORD}@{HOSTNAME}:{POST}/{DATABASE}' \

engine = create_engine(DB_URL)

创建完引擎就开始与之前不一样了。

from sqlalchemy.ext.declarative import declarative_base
Base = declarative_base(engine)

base是一个类,每当创建一个新的表格都要继承这个类

在ORM中,数据库有着以下的对应形式

数据库
类本省身数据表
属性字段
实例化的对象数据表的记录

懂了这些原理,我们来编写一下类函数

class STU(Base):
    __tablename__ = 'STU'

    id = Column(Integer,primary_key=True,autoincrement=True)
    #允许为空为Flase,是不允许为空
    name = Column(String(50),nullable=False)
    gender = Column(Integer,default=1,comment='1为男,2为女')

再使用下面这条语句来生成数据表

Base.metadata.create_all()

在这里插入图片描述
在这里插入图片描述

在sqlyog中我们确实发现生成了表格。

表数据的增删改查

既然会了如何创建表,那么接下来就来看看表数据的增删改查。

不过讲这四个操作之前一定要讲一个session,它是这四个操作的前提。

from sqlalchemy.orm import sessionmaker
session = sessionmaker(bind=engine)
session = session()

如上操作完之后我们就可以使用这个session来进行增删改查的操作了。

表数据的增加

数据的添加是通过session.add方法实现的

def add_data():
    record1 = STU(name='海绵宝宝',gender=1)
    session.add(record1)
    session.commit()
if __name__ == '__main__':
    add_data()

在这里插入图片描述

表数据的查找
基于query的查询方法

数据的查找是通过session.query实现的

def find_data():
    instances = session.query(STU.name,STU.gender)
    for items in instances:
        print(items)
    instances = session.query(STU,STU.id,STU.name).all()
    for items in instances:
        print(items)
    instances = session.query(STU).order_by(STU.name)
    for items in instances:
        print(items.id,items.name,items.gender)

打印的结果

('海绵宝宝', 1)
('派大星', 1)
('章鱼哥', 1)
(<__main__.STU object at 0x0000014AD186F240>, 1, '海绵宝宝')
(<__main__.STU object at 0x0000014AD186F2B0>, 2, '派大星')
(<__main__.STU object at 0x0000014AD186F320>, 3, '章鱼哥')
2 派大星 1
1 海绵宝宝 1
3 章鱼哥 1

这里大家要注意,STU查找出来的就是STU object形式,STU点上属性就是查找记录。

基于str魔法方法的查询
instances = session.query(STU)
for items in instances:
    print(items)

然后我们看打印它的结果

id:1,name:海绵宝宝,gender:1
id:2,name:派大星,gender:1
id:3,name:章鱼哥,gender:1

就不再是STU object的形式了

filter过滤
instances = session.query(STU).filter(STU.id == 2).all()
for items in instances:
    print(items)

使用filter就可以达到查找拥有你想要的特性的记录

还有,这条语句与下面的语句是相同的功能

instances = session.query(STU).filter_by(id=2).all()
for items in instances:
    print(items)
表数据的修改
def update():
    for items in session.query(STU).filter_by(name='章鱼哥').all():
        print(items)
        items.name = '蟹老板'
        print(items)
        session.commit()

修改后千万不要忘了用commit提交

表数据的删除
def del_date():
    date = session.query(STU).filter(id=1).all()
    session.delete(date)

大家可能以为删除是这样的的,但是实际开发中千万不要这样做。

实际开发中我们要设计一个is-delete标志位,默认为0,被 删除后标志为1

datas = session.query(STU).filter(STU.id==1,STU.is_delete==0).all()
for data in datas:
    data.is_delete = 1
session.commit()

在这里插入图片描述

被标记为删除。

sqlalchemy的常用数据类型

Integer:整形

Float:浮点类型

Boolean:布尔型

DECIMAL:定点数

enum:枚举类型

Date:传递datetime.date()进去

DateTime:传递datetime.datetime()进去

Time:传递datetime.time()进去

String:字符类型,使用时需要指定长度,区别于Text类型

Text:文本类型

LONGTEXT:长文本类型

from sqlalchemy import create_engine
from sqlalchemy.ext.declarative import declarative_base
from sqlalchemy import Column,Integer,String,DateTime,DECIMAL,Enum
from sqlalchemy.orm import sessionmaker
from datetime import datetime

HOSTNAME = '127.0.0.1'
PORT = '3306'
DATABASE = 'mytest-02'
USERNAME = 'root'
PASSWORD = 'root'
DB_URL = f'mysql+pymysql://{USERNAME}:{PASSWORD}@{HOSTNAME}:{PORT}/{DATABASE}'

engine = create_engine(DB_URL)
Base = declarative_base(engine)


class Mytest(Base):
    __tablename__ = 'bookshelf'

    id = Column(Integer,primary_key=True,autoincrement=True)
    name = Column(String(50))
    price = Column(DECIMAL(20, 5))
    author = Column(String(50))
    publish_date = Column(DateTime)
    status = Column(Enum('有货','缺货'))
    ondatetime = Column(DateTime,onupdate=datetime.now())

    def __str__(self):
        dic1 = dict(zip(['id','name','price','author','publish_date','status'],[self.id,self.name,self.price,self.author,self.publish_date,self.status]))
        return str(dic1)

# Base.metadata.drop_all()
# Base.metadata.create_all()
Session = sessionmaker(bind=engine)
session = Session()
# book1 = Mytest(name='python编程从入门到实践', price=89.12, author='Eirc Matthes', publish_date=datetime(2016, 7, 15,0,0),status='有货',ondatetime=None)
# book2 = Mytest(name='python编程从数据到机器学习实践', price=99.80, author='刘喻', publish_date=datetime(2020, 2, 1), status='有货')
# session.add(book1)
# session.add(book2)
# session.commit()

在这里插入图片描述

query的参数
Max = session.query(func.max(Mytest.price))
for item in Max:
    print(item)
Avg = session.query(func.avg(Mytest.price))
for item in Avg:
    print(item)
(Decimal('99.80000'),)
(Decimal('94.460000000'),)
query的参数
Max = session.query(func.max(Mytest.price))
for item in Max:
    print(item)
Avg = session.query(func.avg(Mytest.price))
for item in Avg:
    print(item)
(Decimal('99.80000'),)
(Decimal('94.460000000'),)

除了这两个外还有,func.min,func.sum,func,count等等。

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值