python SQLAchemy多外键关联
关联同一张表的两个字段
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()
查询结果
多对多关系
现在来设计一个能描述“图书”与“作者”的关系的表结构,需求是
- 一本书可以有好几个作者一起出版
- 一个作者可以写好几本书
此时你会发现,用之前学的外键好像没办法实现上面的需求了,因为
当然你更不可以像下面这样干,因为这样就你就相当于有多条书的记录了,太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多外键关联的更多相关文章
- Python sqlalchemy orm 外键关联
创建外键关联 并通过relationship 互相调用 如图: 实现代码: import sqlalchemy # 调用链接数据库 from sqlalchemy import create_engi ...
- 【Python】django模型models的外键关联使用
Python 2.7.10,django 1.8.6 外键关联:http://www.bubuko.com/infodetail-618303.html 字段属性:http://www.cnblogs ...
- pythonのsqlalchemy外键关联查询
#!/usr/bin/env python import sqlalchemy from sqlalchemy import create_engine from sqlalchemy.ext.dec ...
- Python sqlalchemy orm 多对多外键关联
多对多外键关联 注:使用三张表进行对应关联 实现代码: # 创建3个表 配置外键关联 # 调用Column创建字段 加类型 from sqlalchemy import Table, Column, ...
- Python sqlalchemy orm 多外键关联
多外键关联 注:在两个表之间进行多外键链接 如图: 案例: # 创建两张表并添加外键主键 # 调用Column创建字段 加类型 from sqlalchemy import Integer, For ...
- 【python】-- pymsql 外键
pymsql 外键 本片是以上一篇pymsql操作MySQL的补充,主要演示pymysql的外键操作使用 一.一对一外键关联 1.示意图 2.一对一外键关联示例 2.1.创建表结构,插入数据 from ...
- 《Entity Framework 6 Recipes》中文翻译系列 (29) ------ 第五章 加载实体和导航属性之过滤预先加载的实体集合和修改外键关联
翻译的初衷以及为什么选择<Entity Framework 6 Recipes>来学习,请看本系列开篇 5-13 过滤预先加载的实体集合 问题 你想过滤预先加载的实体集合,另外,你想使用 ...
- 《Entity Framework 6 Recipes》中文翻译系列 (37) ------ 第六章 继承与建模高级应用之独立关联与外键关联
翻译的初衷以及为什么选择<Entity Framework 6 Recipes>来学习,请看本系列开篇 6-13 在基类中应用条件 问题 你想从一个已存在的模型中的实体派生一个新的实体, ...
- Entity Framework Code First添加修改及删除外键关联实体
1.添加外键关联实体 1>.添加新的Province及City实体 using (var ctx = new PortalContext()) { var city1 = new City { ...
随机推荐
- C# 修改系统时间
/// <summary> /// 同步服务时间 /// </summary> public class SyncServerTime { //设置系统时间的API函数 [Dl ...
- Centos 7搭建Gitlab服务器(一),搭配文章(二)一起使用,效果更好
一. 安装并配置必要的依赖关系在CentOS系统上安装所需的依赖:ssh,防火墙,postfix(用于邮件通知) ,wget,以下这些命令也会打开系统防火墙中的HTTP和SSH端口访问. 1.安装ss ...
- python调用另一个.py文件中的类和函数
同一文件夹下的调用 1.调用函数 A.py文件如下:def add(x,y): print('和为:%d'%(x+y)) 在B.py文件中调用A.py的add函数如下: import AA.ad ...
- 新建IP核为灰色并显示there is no project open
问题: ise显示there is no project open. “You may browse the IP Catalog but you will not be able to genera ...
- pointer-events属性值详解
其实早知道这个属性,但是一直没有去研究过.今天正好在twitter看到这个词,就去研究了下,正好解决了目前遇到的一个小难题,所以分享下.嗯,其实这是个比较简单的CSS3属性. 在某个项目中,很多元素需 ...
- Visual Studio2017中如何让ADO.NET实体数据模型[EntityFramework]支持MariaDB&MySQL数据源
近期由于工作需要,需要重新修改设计系统的ADO.NET实体数据模型.edmx文件中间,在完成实际中途遇到一些实际使用问题,特此记录. 1. Visual Studio 2017 无法以实体设计模式打开 ...
- Ajax介绍及爬取哔哩哔哩番剧索引追番人数排行
Ajax,是利用JavaScript在保证页面不被刷新,页面链接不改变的情况下与服务器交换数据并更新部分网页的技术.简单的说,Ajax使得网页无需刷新即可更新其内容.举个例子,我们用浏览器打开新浪微博 ...
- Magento 2中文手册教程 - 如何获得 Magento 2
Magento 2 安装 我们搜集了一些信息来帮助您开始使用Magento 2和你的Magento 2安装. 我们有一些资源帮助您开始使用Magento 2. 如何获得 Magento 2 参考下表开 ...
- XAMl使用其他命名空间中的类型及加载和编译
以前我们讲过XAMl命名空间.为了使便宜钱知道XAMl文档中元素对应的.NET类型,需要知道XAMl明档中指定特定的两个命名空间.XAML是一种实例化.NET对象的通用方法 ,除了可以实例化一些标准的 ...
- js实现栈
栈是一种先进后出的特殊线性表结构,存储上分链式存储和顺序存储两种方式 链式存储: function LinkedStack() { let Node = function (ele) { this.e ...