【Flask】数据的CRUD之增加和查询操作

1、创建模型类,生成数据表

#第一步:创建基类
Base=declarative_base(engine)

#第二步:定义python类和表的映射
class Person(Base):
    __tablename__='t_person'  #创建表名,最好是t_开头
    id=Column(name='id',type_=Integer,primary_key=True,autoincrement=True)
    name=Column(name='name',type_=String(255))
    age=Column(name='age',type_=Integer)
    address=Column(name='address',type_=String(255))
    country=Column(name='country',type_=String(50))  #创建表之后新加的字段
    city=Column(name='city',type_=String(50))        #创建表之后新加的字段

     def __str__(self):
        return '姓名:{}-年领:{}-地址:{}-国家:{}-城市:{}'.format(self.name,self.age,self.address,self.country,self.city)


#第三步:模型类创建表
#Base.metadata.drop_all()
Base.metadata.create_all()

2、 构建session对象:

所有和数据库的ORM操作都必须通过一个叫做session的会话对象来实现
通过以下代码来获取会话对象:

from sqlalchemy.orm import sessionmaker
engine = create_engine(DB_URI)
Base = declarative_base(engine)
session = sessionmaker(engine)() # 注意,返回的是一个函数

特别注意1:session = sessionmaker(engine)() 返回的是一个函数

3、增加数据(C)

增加一条数据

#创建对象,也即创建一条数据:
p1=Person(name='zz',age=20,address='丰台区',country='中国',city='北京')
# 将这个对象添加到`session`会话对象中:
session.add(p1)
# 将session中的对象做commit操作(提交)
session.commit()

一次性增加多条数据

#添加数据到数据库
p1=Person(name='django',age=17,address='丰台区',country='中国',city='北京')
p2=Person(name='kb',age=21,address='大兴区',country='中国',city='北京')
p3=Person(name='python',age=18,address='昌平区',country='中国',city='北京')
p4=Person(name='flask',age=25,address='海淀区',country='中国',city='北京')
session.add_all([p1,p2,p3,p4])
session.commit()

在这里插入图片描述

4、查找数据

1、查找模型对应的表中所有的数据

all_person=session.query(Person).all()
for person in all_person:
    print(person)
姓名:zz-年领:20-地址:丰台区-国家:中国-城市:北京
姓名:django-年领:17-地址:丰台区-国家:中国-城市:北京
姓名:kb-年领:21-地址:大兴区-国家:中国-城市:北京
姓名:python-年领:18-地址:昌平区-国家:中国-城市:北京
姓名:flask-年领:25-地址:海淀区-国家:中国-城市:北京

2、使用first方法获取结果集中的第一条数据

p1=session.query(Person).first()
print(p1)
姓名:zz-年领:20-地址:丰台区-国家:中国-城市:北京

3、使用filter来做条件查询
例如:查询年领在20岁以上的人物信息

p2=session.query(Person).filter(Person.age>20)
print(p2)

打印结果:是一条sql语句

SELECT t_person.id AS t_person_id, t_person.name AS t_person_name, t_person.age AS t_person_age, t_person.address AS t_person_address, t_person.country AS t_person_country, t_person.city AS t_person_city 
FROM t_person 
WHERE t_person.age > %(age_1)s

注意2:只有加上first,all函数才会返回具体的数据,不然只打印出sql语句

p3=session.query(Person).filter(Person.age>20).all()
for p in p3:
    print(p)
姓名:kb-年领:21-地址:大兴区-国家:中国-城市:北京
姓名:flask-年领:25-地址:海淀区-国家:中国-城市:北京

4、使用filter_by来做条件查询

p4=session.query(Person).filter_by(age=20).all()
for p in p4:
   print(p)
姓名:zz-年领:20-地址:丰台区-国家:中国-城市:北京

5、filter过滤条件:

过滤是数据提取的一个很重要的功能,以下对一些常用的过滤条件进行解释,并且这些过滤条件都是只能通过filter方法实现的:
特别注意3:filter:用模型类名.属性名=='属性值’的方式过滤查询

1.equals :

查询名字叫python的人物信息

p5=session.query(Person).filter(Person.name=='python').all()
print(p5)

2.not equals : !

查询名字不叫flask的人物信息

p6=session.query(Person).filter(Person.name!='flask').all()
print(p6)

3.like & ilike [不区分大小写]:

查询名字包含an的人物信息

p7=session.query(Person).filter(Person.name.like('%an%')).all()
print(p7)

4. in_:

查询地区为海淀区和昌平区下的人物信息

p8=session.query(Person).filter(Person.address.in_(['昌平区','海淀区'])).all()
print(p8)

5. not in:

查询地区不是海淀区和昌平区下的任务信息

p9=session.query(Person).filter(~Person.address.in_(['昌平区','海淀区'])).all()
print(p9)

6. is null:

查询年领为None的人物信息

p10=session.query(Person).filter(Person.age==None).all()
print(p10)
或者
p11=session.query(Person).filter(Person.age.is_(None)).all()
print(p11)

7. is not null:

查询年领不为None的人物信息

p12=session.query(Person).filter(Person.age!=None).all()
print(p12)
p13=session.query(Person).filter(Person.age.isnot(None)).all()
print(p13)

8. and_:

查询姓名是python,并且年领为20岁的人物信息

p14=session.query(Person).filter(Person.name=='python',Person.age=='20').all()
print(p14)
或者
p15 = session.query(Person).filter(and_(Person.name == 'python', Person.age == '20')).all()
print(p15)
或者
p16= session.query(Person).filter(Person.name == 'python').filter(Person.age=='20').all()
print(p16)

9. or_:

查询姓名是python,或者年领为18岁的人物信息

p17=session.query(Person).filter(or_(Person.name=='python',Person.age=='20')).all()
print(p17)

特别注意4:上面的and_、or_都需要导入

from sqlalchemy import and_,or_
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

敲代码敲到头发茂密

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值