【Flask】ORM一对一关联关系
在sqlalchemy中,如果想要將兩個模型映射成一對一的關系,那么應該在父模型中,指定引用的時候,要傳遞一個uselist=False這個參數進去。就是告訴父模型,以后引用這個從模型的時候,不再是一個列表了,而是一個對象了。
方法一:參照一對多關聯,把uselist=false,加在沒有外鍵的對象中,其他的和前面一對多關聯是一樣的
配置數據庫、創建數據庫引擎、創建基類
from sqlalchemy import create_engine, Column, Integer, ForeignKey, String, TEXT, Boolean, DATE, DECIMAL from sqlalchemy.ext.declarative import declarative_base from datetime import date from sqlalchemy.orm import sessionmaker,relationship,backref # 數據庫的配置變量 HOSTNAME = '127.0.0.1' PORT = '3306' DATABASE = 'test' USERNAME = 'root' PASSWORD = 'root' DB_URI = 'mysql+pymysql://{}:{}@{}:{}/{}?charset=utf8mb4'.format(USERNAME, PASSWORD, HOSTNAME, PORT, DATABASE)#創建數據庫引擎 engine=create_engine(DB_URI)#創建模型類基類 Base=declarative_base(engine)#創建session對象 session=sessionmaker(engine)()創建模型類
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))# 當前人對應的身份證id_card=relationship('ID_Card')def __str__(self):return f'Person-編號{self.id}姓名{self.name}年領{self.age} class ID_Card(Base):__tablename__ = 't_id_card'card_number = Column(name='card_number', type_=String(18), primary_key=True)p_id=Column(Integer,ForeignKey('t_person.id'))# 表示該身份證對應的人person=relationship('Person')def __str__(self):return f"ID_Card-身份證號{self.card_number}"查詢數據
1、查詢名字叫python的身份證號:
def select():p1=session.query(Person).filter(Person.name=='python').first()print(p1) #名字叫python的人物信息print(p1.id_card) #名字叫python的身份證信息print(p1.id_card.card_number) #名字叫python的身份證號 Person-編號1姓名python年領18 ID_Card-身份證號112121212 1121212122、查詢身份證號112121212是誰?
def select():#查詢身份證號112121212是誰?id1=session.query(ID_Card).filter(ID_Card.card_number=='112121212').first()print(id1) #身份證是112121212的身份證信息print(id1.person) #身份證是112121212的人物信息print(id1.person.name) #身份證是112121212的人物名字 ID_Card-身份證號112121212 Person-編號1姓名python年領18 python方法二:推薦使用
特別注意:uselist=False:告訴id_card不是一個列表
特別注意2:person=relationship(‘Person’,backref=backref(‘id_card’,uselist=False))的寫法
查詢數據
1、查詢名字叫python的身份證號:
def select():p1=session.query(Person).filter(Person.name=='python').first()print(p1) #名字叫python的人物信息print(p1.id_card) #名字叫python的身份證信息print(p1.id_card.card_number) #名字叫python的身份證號 Person-編號1姓名python年領18 ID_Card-身份證號112121212 1121212122、查詢身份證號112121212是誰?
def select():id1=session.query(ID_Card).filter(ID_Card.card_number=='112121212').first()print(id1) #身份證是112121212的身份證信息print(id1.person) #身份證是112121212的人物信息print(id1.person.name) #身份證是112121212的人物名字 ID_Card-身份證號112121212 Person-編號1姓名python年領18 python更新數據
3、將手機號為13888888888的人物的身份證號改為“666666666”
def update():res=session.query(Person).filter(Person.phone=='13888888888').first()res.id_card.card_number='666666666'session.commit()4、將身份證編號為3的信息,人物姓名改為zhilong
def update():res1=session.query(ID_Card).filter(ID_Card.card_id==3).first()print(res1.person)res1.person.p_name='zhilong'session.commit()刪除數據
5、將手機號為13111118的人物信息刪除
def delete():res2=session.query(Person).filter(Person.phone=='1311118').first()session.delete(res2)session.commit()6、將手機號為1311115的人物信息的身份證信息刪除
def delete():res2 = session.query(Person).filter(Person.phone == '1311115').first()print(res2.id_card)session.delete(res2.id_card)session.commit()7、將身份證編號為2的人物信息刪除
def delete():res3=session.query(ID_Card).filter(ID_Card.card_id==2).first()session.delete(res3.person)session.commit()建表的時候可能會出現的問題:
sqlalchemy.exc.InvalidRequestError: On relationship ID_Card.person, ‘dynamic’ loaders cannot be used with many-to-one/one-to-one relationships and/or uselist=False.
是因為在模型類中加了懶加載,而一對一模式不需要懶加載
錯誤的:
正確的是
id_card=relationship('ID_Card',backref=backref('person',uselist=False))總結
以上是生活随笔為你收集整理的【Flask】ORM一对一关联关系的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 【Flask】数据的CRUD之增加和查询
- 下一篇: 关于“ModuleNotFoundErr