【Flask】ORM一对一关联关系
在sqlalchemy中,如果想要將兩個(gè)模型映射成一對(duì)一的關(guān)系,那么應(yīng)該在父模型中,指定引用的時(shí)候,要傳遞一個(gè)uselist=False這個(gè)參數(shù)進(jìn)去。就是告訴父模型,以后引用這個(gè)從模型的時(shí)候,不再是一個(gè)列表了,而是一個(gè)對(duì)象了。
方法一:參照一對(duì)多關(guān)聯(lián),把uselist=false,加在沒有外鍵的對(duì)象中,其他的和前面一對(duì)多關(guān)聯(lián)是一樣的
配置數(shù)據(jù)庫(kù)、創(chuàng)建數(shù)據(jù)庫(kù)引擎、創(chuàng)建基類
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 # 數(shù)據(jù)庫(kù)的配置變量 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)#創(chuàng)建數(shù)據(jù)庫(kù)引擎 engine=create_engine(DB_URI)#創(chuàng)建模型類基類 Base=declarative_base(engine)#創(chuàng)建session對(duì)象 session=sessionmaker(engine)()創(chuàng)建模型類
class Person(Base):__tablename__='t_person' #創(chuàng)建表名,最好是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))# 當(dāng)前人對(duì)應(yīng)的身份證id_card=relationship('ID_Card')def __str__(self):return f'Person-編號(hào){self.id}姓名{self.name}年領(lǐng){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'))# 表示該身份證對(duì)應(yīng)的人person=relationship('Person')def __str__(self):return f"ID_Card-身份證號(hào){self.card_number}"查詢數(shù)據(jù)
1、查詢名字叫python的身份證號(hào):
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的身份證號(hào) Person-編號(hào)1姓名python年領(lǐng)18 ID_Card-身份證號(hào)112121212 1121212122、查詢身份證號(hào)112121212是誰(shuí)?
def select():#查詢身份證號(hào)112121212是誰(shuí)?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-身份證號(hào)112121212 Person-編號(hào)1姓名python年領(lǐng)18 python方法二:推薦使用
特別注意:uselist=False:告訴id_card不是一個(gè)列表
特別注意2:person=relationship(‘Person’,backref=backref(‘id_card’,uselist=False))的寫法
查詢數(shù)據(jù)
1、查詢名字叫python的身份證號(hào):
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的身份證號(hào) Person-編號(hào)1姓名python年領(lǐng)18 ID_Card-身份證號(hào)112121212 1121212122、查詢身份證號(hào)112121212是誰(shuí)?
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-身份證號(hào)112121212 Person-編號(hào)1姓名python年領(lǐng)18 python更新數(shù)據(jù)
3、將手機(jī)號(hào)為13888888888的人物的身份證號(hào)改為“666666666”
def update():res=session.query(Person).filter(Person.phone=='13888888888').first()res.id_card.card_number='666666666'session.commit()4、將身份證編號(hào)為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()刪除數(shù)據(jù)
5、將手機(jī)號(hào)為13111118的人物信息刪除
def delete():res2=session.query(Person).filter(Person.phone=='1311118').first()session.delete(res2)session.commit()6、將手機(jī)號(hào)為1311115的人物信息的身份證信息刪除
def delete():res2 = session.query(Person).filter(Person.phone == '1311115').first()print(res2.id_card)session.delete(res2.id_card)session.commit()7、將身份證編號(hào)為2的人物信息刪除
def delete():res3=session.query(ID_Card).filter(ID_Card.card_id==2).first()session.delete(res3.person)session.commit()建表的時(shí)候可能會(huì)出現(xiàn)的問(wèn)題:
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.
是因?yàn)樵谀P皖愔屑恿藨屑虞d,而一對(duì)一模式不需要懶加載
錯(cuò)誤的:
正確的是
id_card=relationship('ID_Card',backref=backref('person',uselist=False))總結(jié)
以上是生活随笔為你收集整理的【Flask】ORM一对一关联关系的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。
- 上一篇: 【Flask】数据的CRUD之增加和查询
- 下一篇: 关于“ModuleNotFoundErr