relationship是为了简化联合查询join等,创建的两个表之间的虚拟关系,这种关系与标的结构时无关的。他与外键十分相似,确实,他必须在外键的基础上才允许使用

不然会报错:

  1. sqlalchemy.exc.NoForeignKeysError: Could not determine join condition between parent/child tables on relationship Father.son - there are no foreign keys linking these tables. Ensure that referencing columns are associated with a ForeignKey or ForeignKeyConstraint, or specify a 'primaryjoin' expression

详细的relationship可以点击这里进行查看

relationship的使用:

使两个表之间产生管理,类似于合成一张表,可以直接取出关联的表,进行获取数据,而不需要join操作

  1. import sqlalchemy
  2. from sqlalchemy import create_engine
  3. from sqlalchemy import Column,String,Integer,ForeignKey
  4. from sqlalchemy.orm import sessionmaker,relationship
  5. from sqlalchemy.ext.declarative import declarative_base
  6.  
  7. engine = create_engine("mysql+pymysql://root:root@127.0.0.1/t1")
  8.  
  9. Base = declarative_base()
  10.  
  11. class Father(Base):
  12. __tablename__ = "father"
  13.  
  14. id = Column(Integer,primary_key=True,autoincrement=True)
  15. name = Column(String(),unique=True)
  16. age = Column(Integer)
  17. son = relationship('Son',backref="father")
  18.  
  19. class Son(Base):
  20. __tablename__ = 'son'
  21.  
  22. id = Column(Integer,primary_key=True,autoincrement=True)
  23. name = Column(String(),unique=True)
  24. age = Column(Integer)
  25.  
  26. father_id = Column(Integer,ForeignKey('father.id'))
  27.  
  28. Base.metadata.create_all(engine)
  29.  
  30. MySession = sessionmaker(bind=engine)
  31. session = MySession()
  32.  
  33. # f = Father(name='ld',age=)
  34. # session.add(f)
  35. # session.commit()
  36. #
  37. # s1 = Son(name='ww',age=,father_id=)
  38. # s2 = Son(name='wb',age=,father_id=)
  39. # session.add_all([s1,s2])
  40. # session.commit()
  41. #一对多情况下:多(包含外键方)
  42.  
  43. ret =session.query(Father).filter_by(id=).first()
  44. #ret.son 是一个列表,其中多的一方会获得一个列表结果,列表中含有其各个对象
  45. for i in ret.son:
  46. print(i.name,i.age)
  47.  
  48. #另一方只会获得一个对象结果
  49. ret2 = session.query(Son).filter_by(id=).first()
  50. print(ret2.father.name)#

原来代码,不需要看

只使用外键,需要使用join才可以取出数据

  1. #上面不存在relationship
    ret = session.query(Father.name.label('kkk'),Son.name.label("ppp")).join(Son).all()#使用Join才可以获取对方数据
  2. print(ret)#是一个列表,列表中存在所要获取的数据(以元组存在)

在外键基础上使用relationship:可以直接通过属性操作获取数据

  1. #使用了relationship
    ret = session.query(Father).filter_by(id=).first()
  2. print(ret.son)#是一个对象列表,其中包含了所有查询数据

全部代码:

其中son = relationship('Son',backref="Father")

相当于在Son中加入father = relationship('Father')在Father中加入son = relationship('Son')

  1. import sqlalchemy
  2. from sqlalchemy import create_engine
  3. from sqlalchemy import Column,String,Integer,ForeignKey
  4. from sqlalchemy.orm import sessionmaker,relationship
  5. from sqlalchemy.ext.declarative import declarative_base
  6.  
  7. engine = create_engine("mysql+pymysql://root:root@127.0.0.1/t1")
  8.  
  9. Base = declarative_base()
  10.  
  11. class Father(Base):
  12. __tablename__ = "father"
  13.  
  14. id = Column(Integer,primary_key=True,autoincrement=True)
  15. name = Column(String(),unique=True)
  16. age = Column(Integer)
  17. son = relationship('Son',backref="Father")
  18. #son = relationship('Son')
  19.  
  20. class Son(Base):
  21. __tablename__ = 'son'
  22.  
  23. id = Column(Integer,primary_key=True,autoincrement=True)
  24. name = Column(String(),unique=True)
  25. age = Column(Integer)
  26. #father = relationship('Father')
  27.  
  28. father_id = Column(Integer,ForeignKey('father.id'))
  29.  
  30. Base.metadata.create_all(engine)
  31.  
  32. MySession = sessionmaker(bind=engine)
  33. session = MySession()
  34.  
  35. ret = session.query(Father).filter_by(id=).first()
  36. print(ret.son) #多个结果[<__main__.Son object at 0x0000000003F192B0>, <__main__.Son object at 0x0000000003F19320>]
  37. #需要循环取值
  38.  
  39. ret = session.query(Son).filter_by(id=).first()
  40. print(ret.father)#一个结果<__main__.Father object at 0x0000000003F196D8>
  41. #直接取值

python---ORM之SQLAlchemy(3)外键与relationship的关系的更多相关文章

  1. Python自动化之sqlalchemy复合外键

    复合外键用法 metadata = MetaData(engine) classedu = Table('classedu', metadata, # Column('qq', BigInteger, ...

  2. sqlalchemy的外键与relationship查询

    https://www.cnblogs.com/goldsunshine/p/9269880.html 讲的很详细. http://www.bjhee.com/flask-ext4.html 思诚之道 ...

  3. sqlalchemy外键和relationship查询

    前面的文章中讲解了外键的基础知识和操作,上一篇文章讲解了sqlalchemy的基本操作.前面两篇文章都是作为铺垫,为下面的文章打好基础.记得初一时第一次期中考试时考的不好,老爸安慰我说:“学习是一个循 ...

  4. sqlalchemy操作----外键关联,relationship

    ... #!_*_coding:utf-8_*_ #__author__:"Alex huang" import sqlalchemy from sqlalchemy import ...

  5. SQLAlchemy(三):外键、连表关系

    SQLAlchemy03 /外键.连表关系 目录 SQLAlchemy03 /外键.连表关系 1.外键 2.ORM关系以及一对多 3.一对一的关系 4.多对多的关系 5.ORM层面的删除数据 6.OR ...

  6. SQLAlchemy03 /外键、连表关系

    SQLAlchemy03 /外键.连表关系 目录 SQLAlchemy03 /外键.连表关系 1.外键 2.ORM关系以及一对多 3.一对一的关系 4.多对多的关系 5.ORM层面的删除数据 6.OR ...

  7. python 外键用法 多对多关系 ORM操作 模板相关

    一.app/models中写类(设计表结构) 1.普通类 class  A(models.Model): id=modles.AutoField(primary_key=True) name=mode ...

  8. Python之SQLAlchemy学习--外键约束问题

    以下问题赞为解决: # class User(Base):# __tablename__ = 'user'# #表的结构# id = Column(String(20), primary_key=Tr ...

  9. sqlalchemy多外键关联

    一.前言 如果有张表A的多个字段关联另一张表B的一个字段,就如同一个客户表的账单地址和发货地址,同时关联地址表中的id字段. 二.事例 # -*- coding: UTF-8 -*- from sql ...

随机推荐

  1. Redis的五种数据类型

    官方的几篇很好的文章: https://redis.io/topics/data-types https://redis.io/topics/data-types-intro https://redi ...

  2. 如何根据元素的className获取元素?

    getElementsByClassName()是HTML5 新增的DOM API.IE8以下不支持 我们知道,原生的方法,是getElementById()和getElementsByTagName ...

  3. \r\n

    转载自http://www.studyofnet.com/news/285.html '\r'是回车,'\n'是换行,前者使光标到行首,后者使光标下移一格,通常敲一个回车键,即是回车,又是换行(\r\ ...

  4. maven依赖有一个步长原则 如果a 对 b和c都有依赖 如果b的步长近则使用b的

    maven依赖有一个步长原则 如果a 对 b和c都有依赖 如果b的步长近则使用b的

  5. lambda函数对象与作用域 (重点)

    Python函数在定义的时候,默认参数L的值就被计算出来了,即[],因为默认参数L也是一个变量,它指向对象[],每次调用该函数,如果改变了L的内容,则下次调用时,默认参数的内容就变了,不再是函数定义时 ...

  6. codeforces701C

    They Are Everywhere CodeForces - 701C 大B,年轻的口袋妖怪训练师,找到了一个由 n 间从左向右的房间组成的大房子.你可以从街道里走入任何一间房子,也可以从任何一间 ...

  7. 一本通1548【例 2】A Simple Problem with Integers

    1548:[例 2]A Simple Problem with Integers 题目描述 这是一道模板题. 给定数列 a[1],a[2],…,a[n],你需要依次进行 q 个操作,操作有两类: 1 ...

  8. 浅谈教你如何掌握Linux系统

    linux能做什么?相信绝大数人都有这样的疑问.可以玩吃鸡吗?可以玩lol吗? 如果你是以娱乐的名义来评价linux的可用性,对不起,linux可能不适合你,因为linux是一个工具,他是教你聪明的, ...

  9. The Unique MST POJ - 1679 (次小生成树)

    Given a connected undirected graph, tell if its minimum spanning tree is unique. Definition 1 (Spann ...

  10. 遍历List、Map删除元素

    遍历List删除元素 方法一: List<String> list = new ArrayList<>(); list.add("1"); list.add ...