一、前言

  如果有张表A的多个字段关联另一张表B的一个字段,就如同一个客户表的账单地址和发货地址,同时关联地址表中的id字段。

二、事例

# -*- coding: UTF-8 -*-
from sqlalchemy import create_engine
from sqlalchemy import Integer, ForeignKey, String, Column
from sqlalchemy.ext.declarative import declarative_base
from sqlalchemy.orm import relationship engine = create_engine("mysql+pymysql://bigberg:111111@172.16.200.49:3306/study",
encoding="utf-8", ) # 连接数据库,echo=True =>把所有的信息都打印出来 Base = declarative_base() # 生成orm基类 class Customer(Base):
__tablename__ = 'customer'
id = Column(Integer, primary_key=True)
name = Column(String(32), nullable=False)
# 多个外键关联
billing_address_id = Column(Integer, ForeignKey("address.id"))
shopping_address_id = Column(Integer, ForeignKey("address.id"))
# foreign_keys 一定要加,否则会报错
billing_address = relationship("Address",foreign_keys=[billing_address_id])
shopping_address = relationship("Address",foreign_keys=[shopping_address_id]) class Address(Base):
__tablename__ = 'address'
id = Column(Integer, primary_key=True)
street = Column(String(64), nullable=False)
city = Column(String(64), nullable=False)
state = Column(String(64), nullable=False) def __repr__(self):
return "省份:%s 城市:%s 街区:%s" %(self.state, self.city, self.street) # 创建表
Base.metadata.create_all(engine)

multi_fk

插入数据,为了整体的简洁,数据操作在另一张表进行

 # -*- coding: UTF-8 -*-
import multi_fk
from multi_fk import Customer
from multi_fk import Address
from sqlalchemy.orm import sessionmaker # 创建session会话
Session_class = sessionmaker(bind=multi_fk.engine)
# 生成session实例
session = Session_class() # 数据
address_obj1 = Address(street='daguanlu', city='hz', state='zj')
address_obj2 = Address(street='gudunlu', city='hz', state='zj')
address_obj3 = Address(street='xinjiekou', city='nj', state='js')
session.add_all([address_obj1,address_obj2,address_obj3]) customer_obj1 = Customer(name="bigberg", billing_address=address_obj1,
shopping_address=address_obj2) customer_obj2 = Customer(name="Jack", billing_address=address_obj3,
shopping_address=address_obj3) session.add_all([customer_obj1,customer_obj2]) session.commit()

multi_fk_data

数据和表结构

mysql> select * from address;
+----+-----------+------+-------+
| id | street | city | state |
+----+-----------+------+-------+
| 1 | daguanlu | hz | zj |
| 2 | gudunlu | hz | zj |
| 3 | xinjiekou | nj | js |
+----+-----------+------+-------+
3 rows in set (0.00 sec) mysql> select * from customer;
+----+---------+--------------------+---------------------+
| id | name | billing_address_id | shopping_address_id |
+----+---------+--------------------+---------------------+
| 1 | bigberg | 1 | 2 |
| 2 | Jack | 3 | 3 |
+----+---------+--------------------+---------------------+
2 rows in set (0.00 sec) mysql> desc address;
+--------+-------------+------+-----+---------+----------------+
| Field | Type | Null | Key | Default | Extra |
+--------+-------------+------+-----+---------+----------------+
| id | int(11) | NO | PRI | NULL | auto_increment |
| street | varchar(64) | NO | | NULL | |
| city | varchar(64) | NO | | NULL | |
| state | varchar(64) | NO | | NULL | |
+--------+-------------+------+-----+---------+----------------+
4 rows in set (0.00 sec) mysql> desc customer;
+---------------------+-------------+------+-----+---------+----------------+
| Field | Type | Null | Key | Default | Extra |
+---------------------+-------------+------+-----+---------+----------------+
| id | int(11) | NO | PRI | NULL | auto_increment |
| name | varchar(32) | NO | | NULL | |
| billing_address_id | int(11) | YES | MUL | NULL | |
| shopping_address_id | int(11) | YES | MUL | NULL | |
+---------------------+-------------+------+-----+---------+----------------+
4 rows in set (0.00 sec)

查询

# -*- coding: UTF-8 -*-

import multi_fk
from multi_fk import Customer
from multi_fk import Address
from sqlalchemy.orm import sessionmaker # 创建session会话
Session_class = sessionmaker(bind=multi_fk.engine)
# 生成session实例
session = Session_class() obj = session.query(Customer).filter(Customer.name=='bigberg').first()
print(obj.name,'\n','bill_address:',obj.billing_address,'\n',
'shopping_address:', obj.shopping_address)
session.commit() #输出
bigberg
bill_address: 省份:zj 城市:hz 街区:daguanlu
shopping_address: 省份:zj 城市:hz 街区:gudunlu

multi_fk_query

sqlalchemy多外键关联的更多相关文章

  1. Python sqlalchemy orm 外键关联

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

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

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

  3. pythonのsqlalchemy外键关联查询

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

  4. Python sqlalchemy orm 多外键关联

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

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

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

  6. sqlalchemy外键关联

    一.创建两张表,并关联外键 导入ForenginKey模块 # -*- coding: UTF-8 -*- from sqlalchemy import create_engine from sqla ...

  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. Python脚本文件(.py)打包为可执行文件(.exe)即避免命令行中包含Python解释器

      在最近的软件工程作业中用到了将Python脚本转化为exe文件这一过程,网上各种博客介绍了很多,有些东西都不完全,我也是综合了很多种方法最后才实现的,我就把这些整理出来,希望可以帮到大家~ 一.环 ...

  2. Linux基础入门--04

    目录结构及文件基本操作 实验介绍: 1.Linux 的文件组织目录结构. 2.相对路径和绝对路径. 3.对文件的移动.复制.重命名.编辑等操作. 一.Linux 目录结构 在讲 Linux 目录结构之 ...

  3. 新手学ajax1

       学习的动力是最近想实现servlet向js传值,是html中的js,因为jsp是可以直接调用java 类的,在网上搜索了好久感觉ajax能帮我实现. 以下代码可以实现js向服务器发出一 requ ...

  4. 软工1816 · 作业(十二)Beta答辩总结

    组长博客 宣传视频 github团队项目仓库 本组成员 队员姓名与学号 124 王彬(组长) 206 赵畅 215 胡展瑞 320 李恒达 131 佘岳昕 431 王源 206 陈文垚 209 陈志炜 ...

  5. 结对随即四则运算(带界面Java版)

    //随机四则运算类 public class 随机四则运算 { public static void main(String[] args) { new 界面();//进入随机四则运算的首界面 } } ...

  6. 结对作业(1.0版)(bug1已修复)

    import java.awt.EventQueue; import javax.swing.JFrame; import javax.swing.JPanel; import javax.swing ...

  7. Internet History, Technology and Security (Week⑨)

    Week ⑨ We are now on the second to last week of the class and finishing up our look at Internet Secu ...

  8. profibus总线和profibus dp的区别

    profibus总线和profibus dp的区别:PROFBUS是一种国际性的开放式的现场总线标准,它既可以用于高速并且对于时间苛求的数据传输,也可以用于大范围的复杂通讯场合.PROFBUS-DP是 ...

  9. Android Toast的多功能封装——Android开发之路1

    Android封装实现各种功能的Toast GitHub地址:https://github.com/SibreiaDante/ToastUtils 效果图: 方法封装如下: showSingleton ...

  10. JMeter性能测试基础 (2) - 变量的使用

    在使用JMeter进行性能测试时,一般情况下要保证样本容量尽可能大,这样才能得到一个比较合理的结果.也就是说,我们不能只对同一个URL进行多次访问,而是要对统一模块下尽可能多的URL进行访问,以取得相 ...