pymsql 外键

本片是以上一篇pymsql操作MySQL的补充,主要演示pymysql的外键操作使用

一、一对一外键关联

1、示意图

2、一对一外键关联示例

2.1、创建表结构,插入数据

from sqlalchemy import create_engine
from sqlalchemy.ext.declarative import declarative_base
from sqlalchemy import Column, Integer, String, DATE, ForeignKey
from sqlalchemy.orm import relationship, sessionmakerconnect = create_engine("mysql+pymysql://root:123456@localhost:3306/test",encoding="utf-8",echo=False)  # 连接数据库,echo=True =>把所有的信息都打印出来Base = declarative_base()  # 生成ORM基类class Student(Base):  # 学生表__tablename__ = "student"id = Column(Integer, primary_key=True)name = Column(String(32), nullable=False)register_date = Column(DATE, nullable=False)def __repr__(self):return "<{0} name:{1}>".format(self.id, self.name)class StudentRecord(Base):   # 学生学习记录表__tablename__ = "study_record"id = Column(Integer, primary_key=True)day = Column(Integer, nullable=False)status = Column(String(32), nullable=False)stu_id = Column(Integer, ForeignKey("student.id"))  # 关联外键#关联student表,然后我需要在study_record里通过student这个字段,就可以去查Student类里面所有的字段,# 反过来利用backref="my_study_record"中的my_study_record,在student表里通过my_study_record这个字段反查study_record类里面的所有字段,Student = relationship("Student", backref="my_study_record")def __repr__(self):return "<name:{0} day:{1} stu_id:{2}>".format(self.Student.name, self.day, self.stu_id)Base.metadata.create_all(connect)  # 创建学生表和学生记录表,在第一次创建后注释session_class = sessionmaker(connect)  # 创建与数据库的会话session class ,这里返回给session的是个class,不是实例
session = session_class()  # 生成session实例#在两个表中插入数据
stu1 = Student(name="test", register_date="2017-05-30")
stu2 = Student(name="test2", register_date="2017-06-30")
record1 = StudentRecord(day=1, status="Y", stu_id=1)
record2 = StudentRecord(day=2, status="Y", stu_id=1)
session.add_all([record1, record2])
session.commit()

2.2、根据关联外键,查对应表中信息

stu_obj = session.query(Student).filter_by(name="test").first()
print(stu_obj.my_study_record)  # 在学生表里查学生对应的学习记录record_obj = session.query(StudentRecord).first()
print(record_obj.Student.name)  # 在学生记录表里面查学习记录对应学生的名字#输出
[<name:test day:1 stu_id:1>, <name:test day:2 stu_id:1>]test

二、一对多外键关联

案例一创建的是:一对一的外键关系,现在是一对多的外键关系

1、一对多外键关联示例:

1.1、创建表结构

from sqlalchemy import Integer, ForeignKey, String, Column
from sqlalchemy.ext.declarative import declarative_base
from sqlalchemy.orm import relationship
from sqlalchemy import create_engineBase = declarative_base()  # orm基类class Customer(Base):   # 消费者表__tablename__ = "customer"id = Column(Integer, primary_key=True)name = Column(String(64))#创建两个外键,都指向address.idbilling_address_id = Column(Integer, ForeignKey("address.id"))shipping_address_id = Column(Integer, ForeignKey("address.id"))#因为有两个外键,需要通过foreign_keys=[外键字段]告诉sqlalchemy关联哪个外键了,不然就会报错billing_address = relationship("Address", foreign_keys=[billing_address_id])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.state + "-" + self.city + "-" + self.streetconnect = create_engine("mysql+pymysql://root:123456@localhost:3306/test",encoding="utf-8",echo=False)  # 连接数据库,echo=True =>把所有的信息都打印出来Base.metadata.create_all(connect)  # 创建所有的表

1.2、插入数据(默认规则创建数据表结构在一个.py文件,增删查改等操作不与表结构.py文件在一起)

import many_foreign_key # 导出表结构创建模块
from sqlalchemy.orm import sessionmaker#创建session与数据库会话类,生成session实例
session_class = sessionmaker(bind=many_foreign_key.connect)
session = session_class()
#创建address
address1 = many_foreign_key.Address(street="nanshanqu", city="shenzhen", state="guangdong")
address2 = many_foreign_key.Address(street="baoanqu", city="shenzhen", state="guangdong")
#创建consumers
c1 = many_foreign_key.Customer(name="test", billing_address=address1, shipping_address=address1)
c2 = many_foreign_key.Customer(name="test1", billing_address=address2, shipping_address=address1)
#添加session提交
session.add_all([address1, address2, c1, c2])
session.commit()

1.3、查询数据

import many_foreign_key
from sqlalchemy.orm import sessionmakerobj = session.query(many_foreign_key.Customer).filter_by(name="test1").first()
print(obj.name, obj.billing_address, obj.shipping_address)#输出
test1 guangdong-shenzhen-baoanqu guangdong-shenzhen-nanshanqu

三、多对多外键关联

通过数据库模拟设计“图书”与“作者”的关系的表结构,从而来演示多对多外键关联:

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

1、多对多外键关联示例:

1.1、创建表结构

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_engineBase = declarative_base()  # 创建orm基类# 创建一张中间表,用于对book表和author表之前的多对多关联, 中间表建立后由ORM自动维护
book_m2m_author = Table("book_m2m_author", Base.metadata,Column("id", Integer, primary_key=True),Column('books_id', Integer, ForeignKey("books.id")),Column('authors_id', Integer, ForeignKey("authors.id")))class Book(Base):__tablename__ = "books"id = Column(Integer, primary_key=True)name = Column(String(64))pub_date = Column(DATE)#关联authors表和中间表book_m2m_author,即可通过books反查出Author表中的数据或者#通过authors反查出books表中的数据authors = relationship("Author", secondary=book_m2m_author, backref="books")def __repr__(self):return self.nameclass Author(Base):__tablename__ = "authors"id = Column(Integer,primary_key=True)name = Column(String(32))def __repr__(self):return self.nameconnect = create_engine("mysql+pymysql://root:123456@localhost:3306/test?charset=utf8",echo=False)  # 连接数据库,echo=True =>把所有的信息都打印出来Base.metadata.create_all(connect)  # 创建所有表

数据关联示意图:

1.2、插入数据

import m2m_foreign_key
from sqlalchemy.orm import sessionmaker#创建session与数据库会话类,生成session实例
session_class = sessionmaker(bind=m2m_foreign_key.connect)
session = session_class()
#创建book信息
b1 = m2m_foreign_key.Book(name="Python", pub_date="2017-08-08")
b2 = m2m_foreign_key.Book(name="JAVA", pub_date="2017-10-08")
b3 = m2m_foreign_key.Book(name="C", pub_date="2017-11-08")
#创建author信息
a1 = m2m_foreign_key.Author(name="test")
a2 = m2m_foreign_key.Author(name="test1")
a3 = m2m_foreign_key.Author(name="test2")
#创建中间表信息
b1.authors = [a1, a3]
b2.authors = [a1, a2, a3]session.add_all([b1, b2, b3, a1, a2, a3])session.commit()

1.3、查询数据

import m2m_foreign_key
from sqlalchemy.orm import sessionmaker#创建session与数据库会话类,生成session实例
session_class = sessionmaker(bind=m2m_foreign_key.connect)
session = session_class()authors_obj = session.query(m2m_foreign_key.Author).filter_by(name="test").first()
print(authors_obj.books)  # 通过books反查出books表中的数据
book_obj = session.query(m2m_foreign_key.Book).filter(m2m_foreign_key.Book.id == 2).first()
print(book_obj.authors)  # 通过authors反查出authors表中的数据
#输出
[Python, JAVA]
[test, test1, test2]

1.4、删除数据

删除数据时不用管book_m2m_authors , sqlalchemy会自动帮你把对应的数据删除

import m2m_foreign_key
from sqlalchemy.orm import sessionmaker#创建session与数据库会话类,生成session实例
session_class = sessionmaker(bind=m2m_foreign_key.connect)
session = session_class()#通过书删除作者
author_obj = session.query(m2m_foreign_key.Author).filter_by(name="test1").first()
book_obj = session.query(m2m_foreign_key.Book).filter_by(name="JAVA").first()
book_obj.authors.remove(author_obj)  # 从一本书里删除一个作者
session.commit()#删除作者,会把这个作者跟所有书的关联关系数据也自动删除
author_obj =session.query(m2m_foreign_key.Author).filter_by(name="test").first()
# print(author_obj.name , author_obj.books)
s.delete(author_obj)
s.commit()

注:处理中文

sqlalchemy设置编码字符集一定要在数据库访问的URL上增加charset=utf8,否则数据库的连接就不是utf8的编码格式

eng = create_engine('mysql://root:root@localhost:3306/test2?charset=utf8',echo=True)

  

转载于:https://www.cnblogs.com/Keep-Ambition/p/8094151.html

【python】-- pymsql 外键相关推荐

  1. sqlite3用python家外键_Django/Sqlite3为带有外键的模型添加一行

    我是Django和SQlite3的新手.我有一个模型(Person),带有(Person_Type)的外键: class Person(models.Model): name = models.Cha ...

  2. python自关联_Django之Mode的外键自关联和引用未定义的Model方法

    Django Model的外键自关联 在django的model定义中,有时需要某个Field引用当前定义的Model,比如一个部门(Department)的Model,它有一个字段是上级部门(sup ...

  3. 5月9日 python学习总结 外键、表之间的关联关系、修改表、清空表内容、复制表...

    一.外键foreign key    外键约束: 1.必须先创建被关联表才能创建关联表 2.插入记录时,必须先插入被关联表的记录,才能插入关联表(要用到被关联表)的记录 3.若不设置同步更新和同步删除 ...

  4. python 全栈开发,Day116(可迭代对象,type创建动态类,偏函数,面向对象的封装,获取外键数据,组合搜索,领域驱动设计(DDD))...

    昨日内容回顾 1. 三个类 ChangeList,封装列表页面需要的所有数据.StarkConfig,生成URL和视图对应关系 + 默认配置 AdminSite,用于保存 数据库类 和 处理该类的对象 ...

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

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

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

    [Python]django模型models的外键关联使用 Python 2.7.10,django 1.8.6 外键关联:http://www.bubuko.com/infodetail-61830 ...

  7. python设置mysql外键_python基础教程之MySQL数据库之-foreign key 外键(一

    今日重点:外键 一对多 多对多 一对一 -------------------------------------------------------------------------------- ...

  8. Python sqlalchemy orm 多外键关联

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

  9. python做值班表预测_Django model一张表中两个字段设置外键参考另一张表两个字段...

    class products(models.Model): MODE_CHOICES=(('week','周'),('day','日')) productname=models.CharField(m ...

最新文章

  1. lookupedit选中之后的事件_姚明之后,易建联之前!曾经的国产第四中锋,为何没去成NBA?...
  2. java 集合差运算_用一个参数的JAVA程序实现集合的交并差运算
  3. 【原创】项目管理得失经验总结
  4. 数字图像处理实验(10):PROJECT 05-01 [Multiple Uses],Noise Generators
  5. 【转】LUA内存分析
  6. This version of the rendering library is more recent than your version of IntelliJ IDEA.
  7. koa-mysql(三)
  8. [Vue源码分析]谷歌翻译后,Vue双向数据绑定失效了?
  9. HTML元素显示与隐藏
  10. struts2核心配置
  11. 如何在vba中实现目录浏览对话框
  12. Android Studio connot resolve symbol XXX 无法解析的符号
  13. 使用Python3将BT种子转磁力链接
  14. HTTP、HTTP2.0、SPDY、HTTPS 你应该知道的一些事
  15. raid 0 1 5 10的区别以及应用
  16. 支持SwiftUI!Swift版图片视频浏览器-JFHeroBrowser上线啦
  17. 肇庆学院计算机选修旷课,化学化工学院考查课管理办法(试行)
  18. 计算机制图员主要学什么,制图员
  19. JAVA IO必会概念
  20. CleanMyMac X真正好用的Mac电脑系统优化软件应用工具

热门文章

  1. 实战SSM_O2O商铺_36【商品】商品列表之Dao+Service+Controller层的实现
  2. Spring JDBC-使用注解配置声明式事务
  3. Java学习笔记(一)--JDK环境
  4. 解决 org.hibernate.HibernateException: No Hibernate Session bound to thread, and configuration does no
  5. abaqus最大应力准则怎么用_ANSYS与ABAQUS对比,你选择那个?
  6. java aes key iv_java – AES / CBC真的需要IV参数吗?
  7. bus.js非父子组件之间通讯
  8. erdas2015几何校正模块在哪_在ERDAS中进行几何校正
  9. mysql创建行_如何在MySQL中创建行生成器?
  10. 小鑫の日常系列故事(六)——奇遇记_JAVA