網(wǎng)約車后臺(tái)平臺(tái)網(wǎng)站建設(shè)昆明關(guān)鍵詞優(yōu)化
目錄
ORM模型映射到數(shù)據(jù)庫(kù)中
?SQLAlchemy對(duì)數(shù)據(jù)的增刪改查操作?編輯
構(gòu)建session對(duì)象
?添加對(duì)象
查找對(duì)象?
修改對(duì)象
刪除對(duì)象
ORM模型映射到數(shù)據(jù)庫(kù)中
用declarative_base
根據(jù)engine
創(chuàng)建一個(gè)ORM基類
from sqlalchemy.ext.declarative import declarative_base
engine = create_engine(DB_URI)
Base = declarative_base(engine)
用這個(gè)Base
類作為基類來寫自己的ORM類。要定義__tablename__
類屬性,來指定這個(gè)模型映射到數(shù)據(jù)庫(kù)中的表名
class Person(Base):__tablename__ ='t_person'
創(chuàng)建屬性來映射到表中的字段,所有需要映射到表中的屬性都應(yīng)該為Column類型
class Person(Base):__tablename__ ='t_person'# 在這個(gè)ORM模型中創(chuàng)建一些屬性,來跟表中的字段進(jìn)行一一映射。# 這些屬性必須是sqlalchemy給我們提供好的數(shù)據(jù)類型id = Column(Integer,primary_key=True,autoincrement=True)name = Column(String(50))age = Column(Integer)country = Column(String(50))
使用Base.metadata.create_all()
來將模型映射到數(shù)據(jù)庫(kù)中
Base.metadata.create_all()
注意
一旦使用
Base.metadata.create_all()
將模型映射到數(shù)據(jù)庫(kù)中后,即使改變了模型的字段,也不會(huì)重新映射了
?SQLAlchemy對(duì)數(shù)據(jù)的增刪改查操作
構(gòu)建session對(duì)象
所有和數(shù)據(jù)庫(kù)的ORM操作都必須通過一個(gè)叫做
session
的會(huì)話對(duì)象來實(shí)現(xiàn),通過以下代碼來獲取會(huì)話對(duì)象
from sqlalchemy.orm import sessionmaker
engine = create_engine(DB_URI)
Base = declarative_base(engine)
session = sessionmaker(engine)()
from sqlalchemy.orm import sessionmaker
: 這行代碼導(dǎo)入了sessionmaker
,它是用于創(chuàng)建會(huì)話(session)的工廠函數(shù)。
engine = create_engine(DB_URI)
: 這行代碼使用了之前構(gòu)建的數(shù)據(jù)庫(kù)連接字符串(DB_URI
)來創(chuàng)建了一個(gè)數(shù)據(jù)庫(kù)引擎(engine
)。
Base = declarative_base(engine)
: 這行代碼使用了declarative_base
函數(shù)來創(chuàng)建了一個(gè)基類(Base
)。然而,請(qǐng)注意,在declarative_base
函數(shù)中傳遞了一個(gè)參數(shù)engine
,這將指定此基類使用的數(shù)據(jù)庫(kù)引擎。
session = sessionmaker(engine)()
: 這行代碼創(chuàng)建了一個(gè)會(huì)話(session)對(duì)象(session
)。sessionmaker
函數(shù)接受一個(gè)引擎作為參數(shù),用于創(chuàng)建會(huì)話。注意后面的額外的一對(duì)括號(hào)()
,它們實(shí)際上調(diào)用了sessionmaker
返回的函數(shù),以創(chuàng)建一個(gè)實(shí)際的會(huì)話對(duì)象。?
?添加對(duì)象
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()
函數(shù):
這個(gè)函數(shù)使用了一個(gè)上下文管理器(
with Session() as session
),它創(chuàng)建了一個(gè)會(huì)話對(duì)象session
。在這個(gè)函數(shù)中,創(chuàng)建了一個(gè)名為
p1
的Person
對(duì)象,該對(duì)象具有名字、年齡和國(guó)家信息。然后將
p1
添加到了會(huì)話中 (session.add(p1)
)。最后調(diào)用
session.commit()
來提交這個(gè)會(huì)話,將數(shù)據(jù)保存到數(shù)據(jù)庫(kù)中。
create_data_many()
函數(shù):
同樣地,這個(gè)函數(shù)也使用了上下文管理器來創(chuàng)建一個(gè)會(huì)話對(duì)象
session
。在這個(gè)函數(shù)中,創(chuàng)建了兩個(gè)名為
p2
和p3
的Person
對(duì)象,分別代表了兩個(gè)不同的人員信息。使用
session.add_all([p2, p3])
一次性將這兩個(gè)對(duì)象添加到會(huì)話中。最后調(diào)用
session.commit()
來提交這個(gè)會(huì)話,將數(shù)據(jù)保存到數(shù)據(jù)庫(kù)中。
查找對(duì)象?
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()
函數(shù):
使用上下文管理器創(chuàng)建了一個(gè)會(huì)話對(duì)象
session
。使用
session.query(Person).all()
查詢了所有的Person
對(duì)象,并將它們以列表的形式返回給變量all_person
。然后通過一個(gè)循環(huán)遍歷了所有的人員,并打印了他們的名字。
query_data_one()
函數(shù):
同樣地,使用上下文管理器創(chuàng)建了一個(gè)會(huì)話對(duì)象
session
。使用
session.query(Person).first()
查詢了第一個(gè)Person
對(duì)象,并將其賦給了變量p1
。最后打印了
p1
對(duì)象的名字。
query_data_by_params()
函數(shù):
這個(gè)函數(shù)演示了如何通過特定的條件來查詢數(shù)據(jù)。
使用了上下文管理器創(chuàng)建了一個(gè)會(huì)話對(duì)象
session
。通過
session.query(Person).filter(Person.name == '呂布').first()
查詢了名字為 '呂布' 的第一個(gè)Person
對(duì)象,并將其賦給了變量p1
。最后打印了
p1
對(duì)象的年齡。?
修改對(duì)象
def update_data():with Session() as session:p1 = session.query(Person).filter(Person.name == '呂布').first()p1.age = 20# 提交事務(wù)session.commit()
?
使用上下文管理器創(chuàng)建了一個(gè)會(huì)話對(duì)象
session
。使用
session.query(Person).filter(Person.name == '呂布').first()
查詢了名字為 '呂布' 的第一個(gè)Person
對(duì)象,并將其賦給了變量p1
。將
p1
對(duì)象的age
屬性更新為20
:p1.age = 20
。最后,通過
session.commit()
提交了事務(wù),將更新保存到數(shù)據(jù)庫(kù)中
刪除對(duì)象
將需要?jiǎng)h除的數(shù)據(jù)從數(shù)據(jù)庫(kù)中查找出來,然后使用session.delete
方法將這條數(shù)據(jù)從session中刪除,最后做commit操作就可以了
def delete_data():with Session() as session:p1 = session.query(Person).filter(Person.name == '貂蟬').first()session.delete(p1)session.commit()
使用上下文管理器創(chuàng)建了一個(gè)會(huì)話對(duì)象
session
。使用
session.query(Person).filter(Person.name == '貂蟬').first()
查詢了名字為 '貂蟬' 的第一個(gè)Person
對(duì)象,并將其賦給了變量p1
。使用
session.delete(p1)
刪除了p1
對(duì)象,即刪除了名字為 '貂蟬' 的人員信息。最后,通過
session.commit()
提交了事務(wù),將刪除操作保存到數(shù)據(jù)庫(kù)中。