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等等。