用session做数据的增删改查操作
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_