关联同一张表的两个字段

Customer表有2个字段都关联了Address表

创建表结构

orm_many_fk.py 只创建表结构

from sqlalchemy import Integer, ForeignKey, String, Column
from sqlalchemy.ext.declarative import declarative_base
from sqlalchemy.orm import relationship
from sqlalchemy import create_engine
Base = declarative_base() class Customer(Base):
__tablename__ = 'customer'
id = Column(Integer, primary_key=True)
name = Column(String(64)) billing_address_id = Column(Integer, ForeignKey("address.id"))
shipping_address_id = Column(Integer, ForeignKey("address.id")) billing_address = relationship("Address",foreign_keys=[billing_address_id]) #foreign_keys 为了区分哪个外键对应哪个字段
shipping_address = relationship("Address",foreign_keys=[shipping_address_id])# class Address(Base):
__tablename__ = 'address'
id = Column(Integer, primary_key=True)
street = Column(String(64))
city = Column(String(64))
state = Column(String(64)) def __repr__(self):
return self.street engine = create_engine("mysql+pymysql://root:@localhost/test",encoding='utf-8')
Base.metadata.create_all(engine) # 创建表结构

orm_api.py 添加数据。查询

from day11 import orm_many_fk
from sqlalchemy.orm import sessionmaker Session_class = sessionmaker(bind=orm_many_fk.engine) # 创建与数据库的会话session class ,注意,这里返回给session的是个class,不是实例
Session = Session_class() # 生成session实例 cursor '''
addr1 = orm_many_fk.Address(street="Tiantongyuan",city="ChangPing",state="BeiJing")
addr2 = orm_many_fk.Address(street="Youryuan",city="ChaoYang",state="BeiJing")
addr3 = orm_many_fk.Address(street="baozipu",city="Haidian",state="BeiJing")
addr4 = orm_many_fk.Address(street="qingfeng",city="Haidian",state="BeiJing") Session.add_all([addr1,addr2,addr3,addr4])
c1 = orm_many_fk.Customer(name="Alex",billing_address=addr1,shipping_address=addr2)
c2 = orm_many_fk.Customer(name="Jack",billing_address=addr3,shipping_address=addr3) Session.add_all([c1,c2])
''' obj = Session.query(orm_many_fk.Customer).filter(orm_many_fk.Customer.name=='alex').first()
print(obj.name,obj.billing_address,obj.shipping_address) Session.commit()

查询结果

多对多关系

现在来设计一个能描述“图书”与“作者”的关系的表结构,需求是

  1. 一本书可以有好几个作者一起出版
  2. 一个作者可以写好几本书

此时你会发现,用之前学的外键好像没办法实现上面的需求了,因为

当然你更不可以像下面这样干,因为这样就你就相当于有多条书的记录了,太low b了,改书名还得都改。。。

那怎么办呢? 此时,我们可以再搞出一张中间表,就可以了

这样就相当于通过book_m2m_author表完成了book表和author表之前的多对多关联。

创建表结构
from sqlalchemy import Table, Column, Integer,String,DATE, ForeignKey
from sqlalchemy.orm import relationship
from sqlalchemy.ext.declarative import declarative_base
from sqlalchemy import create_engine
from sqlalchemy.orm import sessionmaker Base = declarative_base() book_m2m_author = Table('book_m2m_author', Base.metadata,
Column('book_id',Integer,ForeignKey('books.id')),
Column('author_id',Integer,ForeignKey('authors.id')),
) class Book(Base):
__tablename__ = 'books'
id = Column(Integer,primary_key=True)
name = Column(String(64))
pub_date = Column(DATE)
#正向查询 通过 Book.authors 查book_m2m_author 关联到Author 反向 Author.books 查book_m2m_author 关联到Book
authors = relationship('Author',secondary=book_m2m_author,backref='books') #secondary 声明第三张表 book_m2m_author def __repr__(self):
return self.name class Author(Base):
__tablename__ = 'authors'
id = Column(Integer, primary_key=True)
name = Column(String(32)) def __repr__(self):
return self.name engine = create_engine("mysql+pymysql://root:@localhost/test",encoding='utf-8')
Base.metadata.create_all(engine) # 创建表结构

添加数据
from day11 import orm_m2m
from sqlalchemy.orm import sessionmaker Session_class = sessionmaker(bind=orm_m2m.engine) # 创建与数据库的会话session class ,注意,这里返回给session的是个class,不是实例
Session = Session_class() # 生成session实例 cursor b1 = orm_m2m.Book(name="lenarn python with Alex",pub_date="2014-01-02")
b2 = orm_m2m.Book(name="lenarn ZB with Alex",pub_date="2015-01-02")
b3 = orm_m2m.Book(name="lenarn paolu with Alex",pub_date="2016-01-02") a1 = orm_m2m.Author(name="Alex")
a2 = orm_m2m.Author(name="Jack")
a3 = orm_m2m.Author(name="Rain") b1.authors = [a1,a3]
b2.authors = [a2]
b3.authors = [a1,a2,a3] Session.add_all([b1,b2,b3,a1,a2,a3]) Session.commit()

查询某个作者下的书

根据作者查书

author_obj = Session.query(orm_m2m.Author).filter(orm_m2m.Author.name =='alex').first()
print(author_obj.books)
print(author_obj.books[1].pub_date) Session.commit()

运行结果

[lenarn python with Alex, lenarn paolu with Alex]
2016-01-02

根据书查作者

book_obj = Session.query(orm_m2m.Book).filter(orm_m2m.Book.id ==2).first()
print(book_obj.authors)
Session.commit()

运行结果

[Rain, Jack, Alex]

python SQLAchemy多外键关联的更多相关文章

  1. Python sqlalchemy orm 外键关联

    创建外键关联 并通过relationship 互相调用 如图: 实现代码: import sqlalchemy # 调用链接数据库 from sqlalchemy import create_engi ...

  2. 【Python】django模型models的外键关联使用

    Python 2.7.10,django 1.8.6 外键关联:http://www.bubuko.com/infodetail-618303.html 字段属性:http://www.cnblogs ...

  3. pythonのsqlalchemy外键关联查询

    #!/usr/bin/env python import sqlalchemy from sqlalchemy import create_engine from sqlalchemy.ext.dec ...

  4. Python sqlalchemy orm 多对多外键关联

    多对多外键关联 注:使用三张表进行对应关联 实现代码: # 创建3个表 配置外键关联 # 调用Column创建字段 加类型 from sqlalchemy import Table, Column, ...

  5. Python sqlalchemy orm 多外键关联

     多外键关联 注:在两个表之间进行多外键链接 如图: 案例: # 创建两张表并添加外键主键 # 调用Column创建字段 加类型 from sqlalchemy import Integer, For ...

  6. 【python】-- pymsql 外键

    pymsql 外键 本片是以上一篇pymsql操作MySQL的补充,主要演示pymysql的外键操作使用 一.一对一外键关联 1.示意图 2.一对一外键关联示例 2.1.创建表结构,插入数据 from ...

  7. 《Entity Framework 6 Recipes》中文翻译系列 (29) ------ 第五章 加载实体和导航属性之过滤预先加载的实体集合和修改外键关联

    翻译的初衷以及为什么选择<Entity Framework 6 Recipes>来学习,请看本系列开篇 5-13  过滤预先加载的实体集合 问题 你想过滤预先加载的实体集合,另外,你想使用 ...

  8. 《Entity Framework 6 Recipes》中文翻译系列 (37) ------ 第六章 继承与建模高级应用之独立关联与外键关联

    翻译的初衷以及为什么选择<Entity Framework 6 Recipes>来学习,请看本系列开篇 6-13  在基类中应用条件 问题 你想从一个已存在的模型中的实体派生一个新的实体, ...

  9. Entity Framework Code First添加修改及删除外键关联实体

    1.添加外键关联实体 1>.添加新的Province及City实体 using (var ctx = new PortalContext()) { var city1 = new City { ...

随机推荐

  1. Windbg双机调试环境配置(Windows7/Windows XP+VirtualBox/VMware+WDK7600)

    简介:Windbg双机调试内核.驱动 下载软件: 下载Windbg(GRMWDK_EN_7600_1.ISO) 下载VirtualBox 5.2/VMware 12 一.安装WDK,这里要提一点的是D ...

  2. MM 后台配置(转)

    本文转自:https://www.cnblogs.com/yanglikun/p/4124797.html 一.全局配置 1.一般配置 SPRO->SAP NETWEAVER -> GEN ...

  3. css一些常用技巧代码

      图片等比例自动缩放 img{ width: auto; height: auto; max-width: 100%; max-height: 100%; } 多行省略  最后line-clamp设 ...

  4. JDK,JRE,JVM的基础理解

    1.JVM -- java virtual machine JVM就是我们常说的java虚拟机,它是整个java实现跨平台的 最核心的部分,所有的java程序会首先被编译为.class的类文件,这种类 ...

  5. 微众api文档,身份证识别,ocr等人脸识别等

    https://cloud.tencent.com/document/product/655/14369 https://cloud.tencent.com/document/product/655/ ...

  6. 局域网电脑之间ping不通解决办法

    局域网电脑之间ping不通一般都是防火墙的原因.解决办法有以下两种方法 1 第一种方法 1 找到Windows防火墙 2点击更改通知设置 3 关闭专用网络防火墙 现在就可以ping通这台机器了. 2  ...

  7. Android学习系列--App列表之拖拽ListView(下)

    接着上篇Android学习系列(10)--App列表之拖拽ListView(上)我们继续实现ListView的拖拽效果. 7.重写onTouchEvent()方法.     在这个方法中我们主要是处理 ...

  8. Java生成二维码和解析二维码URL

    二维码依赖jar包,zxing <!-- 二维码依赖 start --><dependency> <groupId>com.google.zxing</gro ...

  9. Unity3d编辑器扩展学习笔记

    编辑器扩展 1.添加菜单栏:把特性应用于静态方法 参数1:菜单名的空格后面是定义快捷键(单符号得用"_"开头,组合键%=Ctrl,#=Shift,&=Alt) 参数2:通过 ...

  10. angular 之 jquery-autocomplete

    自动完成还是原来的 bassistance.de 好用,详细用法参考官网. angular的js paths配置及依赖关系不多说: 'jquery': 'static/jquery-1.11.3/jq ...