目录
ORM模型映射到数据库中
SQLAlchemy对数据的增删改查操作编辑
构建session对象
添加对象
查找对象
修改对象
删除对象
用declarative_base
根据engine
创建一个ORM基类
from sqlalchemy.ext.declarative import declarative_base
engine = create_engine(DB_URI)
Base = declarative_base(engine)
用这个Base
类作为基类来写自己的ORM类。要定义__tablename__
类属性,来指定这个模型映射到数据库中的表名
class Person(Base):
__tablename__ ='t_person'
创建属性来映射到表中的字段,所有需要映射到表中的属性都应该为Column类型
class Person(Base):
__tablename__ ='t_person'
# 在这个ORM模型中创建一些属性,来跟表中的字段进行一一映射。
# 这些属性必须是sqlalchemy给我们提供好的数据类型
id = Column(Integer,primary_key=True,autoincrement=True)
name = Column(String(50))
age = Column(Integer)
country = Column(String(50))
使用Base.metadata.create_all()
来将模型映射到数据库中
Base.metadata.create_all()
注意
一旦使用
Base.metadata.create_all()
将模型映射到数据库中后,即使改变了模型的字段,也不会重新映射了
所有和数据库的ORM操作都必须通过一个叫做
session
的会话对象来实现,通过以下代码来获取会话对象
from sqlalchemy.orm import sessionmaker
engine = create_engine(DB_URI)
Base = declarative_base(engine)
session = sessionmaker(engine)()
from sqlalchemy.orm import sessionmaker
: 这行代码导入了sessionmaker
,它是用于创建会话(session)的工厂函数。
engine = create_engine(DB_URI)
: 这行代码使用了之前构建的数据库连接字符串(DB_URI
)来创建了一个数据库引擎(engine
)。
Base = declarative_base(engine)
: 这行代码使用了declarative_base
函数来创建了一个基类(Base
)。然而,请注意,在declarative_base
函数中传递了一个参数engine
,这将指定此基类使用的数据库引擎。
session = sessionmaker(engine)()
: 这行代码创建了一个会话(session)对象(session
)。sessionmaker
函数接受一个引擎作为参数,用于创建会话。注意后面的额外的一对括号()
,它们实际上调用了sessionmaker
返回的函数,以创建一个实际的会话对象。
def create_data_one():
with Session() as session:
p1 = Person(name = '春秋',age = 6 , country='北京')
session.add(p1)
session.commit()
def create_data_many():
with Session() as session:
p2 = Person(name = '吕布',age = 19 , country='北京')
p3 = Person(name = '貂蝉',age = 18 , country='北京')
session.add_all([p2,p3])
session.commit()
create_data_one()
函数:
这个函数使用了一个上下文管理器(
with Session() as session
),它创建了一个会话对象session
。在这个函数中,创建了一个名为
p1
的Person
对象,该对象具有名字、年龄和国家信息。然后将
p1
添加到了会话中 (session.add(p1)
)。最后调用
session.commit()
来提交这个会话,将数据保存到数据库中。
create_data_many()
函数:
同样地,这个函数也使用了上下文管理器来创建一个会话对象
session
。在这个函数中,创建了两个名为
p2
和p3
的Person
对象,分别代表了两个不同的人员信息。使用
session.add_all([p2, p3])
一次性将这两个对象添加到会话中。最后调用
session.commit()
来提交这个会话,将数据保存到数据库中。
def query_data_all():
with Session() as session:
all_person = session.query(Person).all()
for p in all_person:
print(p.name)
def query_data_one():
with Session() as session:
p1 = session.query(Person).first()
print(p1.name)
def query_data_by_params():
with Session() as session:
# p1 = session.query(Person).filter_by(name='吕布').first()
p1 = session.query(Person).filter(Person.name == '吕布').first()
print(p1.age)
query_data_all()
函数:
使用上下文管理器创建了一个会话对象
session
。使用
session.query(Person).all()
查询了所有的Person
对象,并将它们以列表的形式返回给变量all_person
。然后通过一个循环遍历了所有的人员,并打印了他们的名字。
query_data_one()
函数:
同样地,使用上下文管理器创建了一个会话对象
session
。使用
session.query(Person).first()
查询了第一个Person
对象,并将其赋给了变量p1
。最后打印了
p1
对象的名字。
query_data_by_params()
函数:
这个函数演示了如何通过特定的条件来查询数据。
使用了上下文管理器创建了一个会话对象
session
。通过
session.query(Person).filter(Person.name == '吕布').first()
查询了名字为 '吕布' 的第一个Person
对象,并将其赋给了变量p1
。最后打印了
p1
对象的年龄。
def update_data():
with Session() as session:
p1 = session.query(Person).filter(Person.name == '吕布').first()
p1.age = 20
# 提交事务
session.commit()
使用上下文管理器创建了一个会话对象
session
。使用
session.query(Person).filter(Person.name == '吕布').first()
查询了名字为 '吕布' 的第一个Person
对象,并将其赋给了变量p1
。将
p1
对象的age
属性更新为20
:p1.age = 20
。最后,通过
session.commit()
提交了事务,将更新保存到数据库中
将需要删除的数据从数据库中查找出来,然后使用session.delete
方法将这条数据从session中删除,最后做commit操作就可以了
def delete_data():
with Session() as session:
p1 = session.query(Person).filter(Person.name == '貂蝉').first()
session.delete(p1)
session.commit()
使用上下文管理器创建了一个会话对象
session
。使用
session.query(Person).filter(Person.name == '貂蝉').first()
查询了名字为 '貂蝉' 的第一个Person
对象,并将其赋给了变量p1
。使用
session.delete(p1)
删除了p1
对象,即删除了名字为 '貂蝉' 的人员信息。最后,通过
session.commit()
提交了事务,将删除操作保存到数据库中。