当前位置:Gxlcms > 数据库问题 > sqlalchemy一对多的关系

sqlalchemy一对多的关系

时间:2021-07-01 10:21:17 帮助过:53人阅读

encoding: utf-8 from sqlalchemy import create_engine,Column,Integer,String,Float,func,and_,or_,Text, ForeignKey from sqlalchemy.ext.declarative import declarative_base from sqlalchemy.orm import sessionmaker,relationship from random import randint HOSTNAME = 127.0.0.1 PORT = 3306 DATABASE = first_sqlalchemy USERNAME = root PASSWORD = 123456 #dialect+driver://username:password@host:port/database DB_URI = "mysql+pymysql://{username}:{password}@{host}:{port}/" "{db}?charset=utf8".format(username=USERNAME,password=PASSWORD,host=HOSTNAME,port=PORT,db=DATABASE) engine = create_engine(DB_URI) Base = declarative_base(engine) # Session = sessionmaker(engine) # session = Session() session = sessionmaker(engine)() #Session(**local_kw) #父表/从表 #user/article class User(Base): __tablename__ = user id = Column(Integer,primary_key=True,autoincrement=True) username = Column(String(32),nullable=False) # articles = relationship("Article") #获取用户发布所有文章 class Article(Base): __tablename__ = article id = Column(Integer,primary_key=True,autoincrement=True) title = Column(String(50),nullable=False) content = Column(Text,nullable=False) uid = Column(Integer,ForeignKey(user.id,ondelete=RESTRICT)) author = relationship(User,backref=articles) #sqlalchemy orm提供的 # Base.metadata.drop_all() # # Base.metadata.create_all() # # # #添加数据 # user = User(username = ‘xiaowu‘) # session.add(user) # session.commit() # # article = Article(title = ‘圣墟‘,content = ‘吹牛逼死坑的小说,天天吹水逼‘,uid = 1) # session.add(article) # session.commit() #现在有个需求,我要查询article表中关联user表的数据,同过uid查询 ‘‘‘ article = session.query(Article).first() uid = article.uid user = session.query(User).get(uid) #get根据主键会对一个对象或None print(user) ‘‘‘ #上面写法也行,但是有没有更简便的呢? # from sqlalchemy.orm import relationship #sqlalchemy为我们提供了 relationship article = session.query(Article).first() #获取user对象 user = article.author print(user) #通过author这个字段就能直接查询出User所有关联的内容 author_name = user.username print(author_name) #我现在又另一个需求,获取用户发布的文章,该怎么做, #首先我们要明白用户跟文章的关系,是 一对 多关系 user = session.query(User).first() article= user.articles print(article)#获取文章对象 ,[<__main__.Article object at 0x0000021D7BA2FC18>]是列表 #获取用户发布的文件title article_title = article[0].title print(article_title) #这时候就有疑问呢,同样是用relationship,为什么获取对象的类型却不一样, ‘‘‘ User (主表)对 Aritcle(子表) relationship 获取 aritcle的对象是列表包裹着的 而 Aritcle(子表) 对 User(主表)relationship 获取 user 的对象 就是 内存对象 要理解这种做法,就要理解一对多关系,user(用户)可以发表多篇文章,而 article(文章) 只能有一个用户发布,所以获取article的对象是列表包裹着的 ‘‘‘ #现在有一个需求 能不能 简化 relationship ,在子表显示 #author = relationship(‘User‘,backref=‘articles‘) ‘‘‘ backref 就是反关联的意思,反向引用, article 通过 author 这个关键字 正向引用 user表中的字段 user 通过 articles 反向引用 article表中的字段 ‘‘‘

 

sqlalchemy一对多的关系

标签:orm   integer   mat   main   写法   float   数据   foreign   发表   

人气教程排行