pythonのsqlalchemy多对多关系
现在来设计一个能描述“图书”与“作者”的关系的表结构,需求是
- 一本书可以有好几个作者一起出版
- 一个作者可以写好几本书
#!/usr/bin/env python
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 engine = create_engine("mysql+pymysql://root:root@localhost/testuser?charset=utf8",encoding="utf-8",echo=True)
# 生成orm基类
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)
authors = relationship("Author",secondary=book_m2m_author,backref="books") 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 # 构建表结构
Base.metadata.create_all(engine)
#!/usr/bin/env python
from day12 import orm_m2m_fk
from sqlalchemy.orm import sessionmaker # 创建与数据库会话实例。
session_class = sessionmaker(bind=orm_m2m_fk.engine) # 生成session实例
session = session_class() # b1 = orm_m2m_fk.Book(name="Java从入门到精通",pub_date="2018-08-08")
# b2 = orm_m2m_fk.Book(name="Python从入门到精通",pub_date="2018-08-08")
# b3 = orm_m2m_fk.Book(name="JavaScript从入门到精通",pub_date="2018-08-08")
# b4 = orm_m2m_fk.Book(name=".Net从入门到精通",pub_date="2018-08-08")
#
#
# a1 = orm_m2m_fk.Author(name="Jerry")
# a2 = orm_m2m_fk.Author(name="Tom")
# a3 = orm_m2m_fk.Author(name="Jack")
#
# b1.authors = [a1,a3]
#
# b3.authors = [a1,a2,a3]
#
# b2.authors = [a2,a3]
#
# b4.authors = [a1]
#
# session.add_all([b1,b2,b3,b4,a1,a2,a3]) a = session.query(orm_m2m_fk.Author).filter(orm_m2m_fk.Author.name=="Jerry").first()
print(a.books)
session.commit()
C:\Users\Administrator\AppData\Local\Programs\Python\Python37\python.exe D:/PythonStudy/charm/01/day12/orm_m2m_aip.py
2018-09-20 09:22:14,652 INFO sqlalchemy.engine.base.Engine SHOW VARIABLES LIKE 'sql_mode'
2018-09-20 09:22:14,652 INFO sqlalchemy.engine.base.Engine {}
2018-09-20 09:22:14,656 INFO sqlalchemy.engine.base.Engine SELECT DATABASE()
2018-09-20 09:22:14,656 INFO sqlalchemy.engine.base.Engine {}
2018-09-20 09:22:14,656 INFO sqlalchemy.engine.base.Engine show collation where `Charset` = 'utf8mb4' and `Collation` = 'utf8mb4_bin'
2018-09-20 09:22:14,656 INFO sqlalchemy.engine.base.Engine {}
C:\Users\Administrator\AppData\Local\Programs\Python\Python37\lib\site-packages\pymysql\cursors.py:170: Warning: (1366, "Incorrect string value: '\\xD6\\xD0\\xB9\\xFA\\xB1\\xEA...' for column 'VARIABLE_VALUE' at row 484")
result = self._query(query)
2018-09-20 09:22:14,658 INFO sqlalchemy.engine.base.Engine SELECT CAST('test plain returns' AS CHAR(60)) AS anon_1
2018-09-20 09:22:14,658 INFO sqlalchemy.engine.base.Engine {}
2018-09-20 09:22:14,658 INFO sqlalchemy.engine.base.Engine SELECT CAST('test unicode returns' AS CHAR(60)) AS anon_1
2018-09-20 09:22:14,658 INFO sqlalchemy.engine.base.Engine {}
2018-09-20 09:22:14,659 INFO sqlalchemy.engine.base.Engine SELECT CAST('test collated returns' AS CHAR CHARACTER SET utf8mb4) COLLATE utf8mb4_bin AS anon_1
2018-09-20 09:22:14,659 INFO sqlalchemy.engine.base.Engine {}
2018-09-20 09:22:14,660 INFO sqlalchemy.engine.base.Engine DESCRIBE `book_m2m_author`
2018-09-20 09:22:14,660 INFO sqlalchemy.engine.base.Engine {}
2018-09-20 09:22:14,661 INFO sqlalchemy.engine.base.Engine DESCRIBE `books`
2018-09-20 09:22:14,661 INFO sqlalchemy.engine.base.Engine {}
2018-09-20 09:22:14,663 INFO sqlalchemy.engine.base.Engine DESCRIBE `authors`
2018-09-20 09:22:14,663 INFO sqlalchemy.engine.base.Engine {}
2018-09-20 09:22:14,668 INFO sqlalchemy.engine.base.Engine BEGIN (implicit)
2018-09-20 09:22:14,668 INFO sqlalchemy.engine.base.Engine SELECT authors.id AS authors_id, authors.name AS authors_name
FROM authors
WHERE authors.name = %(name_1)s
LIMIT %(param_1)s
2018-09-20 09:22:14,669 INFO sqlalchemy.engine.base.Engine {'name_1': 'Jerry', 'param_1': 1}
2018-09-20 09:22:14,670 INFO sqlalchemy.engine.base.Engine SELECT books.id AS books_id, books.name AS books_name, books.pub_date AS books_pub_date
FROM books, book_m2m_author
WHERE %(param_1)s = book_m2m_author.author_id AND books.id = book_m2m_author.book_id
2018-09-20 09:22:14,670 INFO sqlalchemy.engine.base.Engine {'param_1': 1}
[Java从入门到精通, JavaScript从入门到精通, .Net从入门到精通]
2018-09-20 09:22:14,675 INFO sqlalchemy.engine.base.Engine COMMIT Process finished with exit code 0
pythonのsqlalchemy多对多关系的更多相关文章
- Python SQLAlchemy多对多外键关联时表结构
# 创建多对多表结构 from sqlalchemy.ext.declarative import declarative_base from sqlalchemy.engine import cre ...
- sqlalchemy 多对多关系
# -*- coding: utf-8 -*- from sqlalchemy import Column, String, create_engine,ForeignKey,Text,Integer ...
- 用SQLAlchemy创建一对多,多对多关系表
多对多关系表的创建: 如果建立好多对多关系后,我们就可以通过关系名进行循环查找,比如laowang = Teacher.query.filter(Teacher.name=='laowang').fi ...
- python3 + flask + sqlalchemy +orm(3):多对多关系
一篇文章有多个tag,一个tag也可以属于多篇文章,文章和tag存在多对多关系 config.py DEBUG = True #dialect+driver://root:1q2w3e4r5t@127 ...
- python测试开发django-32.admin后台多对多关系ManyToManyField
前言 一本书可以有多个作者,一个作者也可以写多本书,这种关系就是本篇要说的多对多关系. 这种场景在django里面数据库设计时候,需要用到ManyToManyField方法 多对多表设计 auther ...
- [ SQLAlchemy ] 自我引用型的多对多关系(Self-Referential Many-to-Many Relationship)理解
参考: https://www.jianshu.com/p/2c6c76f94b88 https://madmalls.com/blog/post/followers-and-followeds/ 实 ...
- python 外键用法 多对多关系 ORM操作 模板相关
一.app/models中写类(设计表结构) 1.普通类 class A(models.Model): id=modles.AutoField(primary_key=True) name=mode ...
- Linux下开发python django程序(django数据库多对多关系)
1.多对多关系数据访问 models.py设置 from django.db import models # Create your models here. sex_choices=( ('f',' ...
- python使用ORM之如何调用多对多关系
在models.py中,我创建了两张表,他们分别是作者表和书籍表,且之间的关系是多对多. # 书 class Book(models.Model): id = models.AutoField(pri ...
随机推荐
- A. Points in Segments(cf a题, 水题)
没什么好说的 #include<iostream> using namespace std; ], x, y,n, m, ans; int main(){ cin>>n> ...
- (五)Cluster Health
Let’s start with a basic health check, which we can use to see how our cluster is doing. We’ll be us ...
- Framework7 索引列表插件的异步加载实现
前言 Framework7 作为移动端的开发框架的优良之处已经无需多言.现在已经有了 React 和 Vue 版本,之前在项目中用过 F7 + vue 的开发方式,无论是效率还是产出都近乎完美.有时间 ...
- SpringCloud(1)服务注册与发现Eureka
1.创建1个空白的工程 2.创建2个model工程 一个module(即SpringBoot)工程作为服务注册中心,即Eureka Server,另一个作为Eureka Client. Eureka ...
- 数据接口测试工具 Postman 介绍
此文介绍好用的数据接口测试工具 Postman,能帮助您方便.快速.统一地管理项目中使用以及测试的数据接口. 1. Postman 简介 Postman 一款非常流行的 API 调试工具.其实,开发人 ...
- 【学习总结】Git学习-参考廖雪峰老师教程-总
公元2018-10-21 实验室台式机 win7 64位 参考教程: 廖雪峰Git教程 其他资料:Git-book 北大一只总结的笔记,最终整理的时候可以参考:Git笔记 评论区看到的另一个人,总结在 ...
- 第七章· Redis Cluster 核心技术
Redis Cluster 分布式集群 Redis Cluster 安装部署 Redis Cluster 集群管理操作(核心)
- 番外篇-AppService服务
一. public async Task<ListResultDto<ArchitectureDto>> GetArchitecture() { var architectur ...
- 在Django中使用ORM创建图书管理系统
一.ORM(对象关系映射) 很多语言的web框架中都有这个概念 1. 为什么要有ORM? 1. 写程序离不开数据,要使用数据就需要连接数据库,但是不同的数据库在sql语句上(mysql,oracle等 ...
- C#操作session的类实例(转)
using System.Web; namespace DotNet.Utilities { public static class SessionHelper2 { /// <summary& ...