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

  1. 一本书可以有好几个作者一起出版
  2. 一个作者可以写好几本书
 #!/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多对多关系的更多相关文章

  1. Python SQLAlchemy多对多外键关联时表结构

    # 创建多对多表结构 from sqlalchemy.ext.declarative import declarative_base from sqlalchemy.engine import cre ...

  2. sqlalchemy 多对多关系

    # -*- coding: utf-8 -*- from sqlalchemy import Column, String, create_engine,ForeignKey,Text,Integer ...

  3. 用SQLAlchemy创建一对多,多对多关系表

    多对多关系表的创建: 如果建立好多对多关系后,我们就可以通过关系名进行循环查找,比如laowang = Teacher.query.filter(Teacher.name=='laowang').fi ...

  4. python3 + flask + sqlalchemy +orm(3):多对多关系

    一篇文章有多个tag,一个tag也可以属于多篇文章,文章和tag存在多对多关系 config.py DEBUG = True #dialect+driver://root:1q2w3e4r5t@127 ...

  5. python测试开发django-32.admin后台多对多关系ManyToManyField

    前言 一本书可以有多个作者,一个作者也可以写多本书,这种关系就是本篇要说的多对多关系. 这种场景在django里面数据库设计时候,需要用到ManyToManyField方法 多对多表设计 auther ...

  6. [ SQLAlchemy ] 自我引用型的多对多关系(Self-Referential Many-to-Many Relationship)理解

    参考: https://www.jianshu.com/p/2c6c76f94b88 https://madmalls.com/blog/post/followers-and-followeds/ 实 ...

  7. python 外键用法 多对多关系 ORM操作 模板相关

    一.app/models中写类(设计表结构) 1.普通类 class  A(models.Model): id=modles.AutoField(primary_key=True) name=mode ...

  8. Linux下开发python django程序(django数据库多对多关系)

    1.多对多关系数据访问 models.py设置 from django.db import models # Create your models here. sex_choices=( ('f',' ...

  9. python使用ORM之如何调用多对多关系

    在models.py中,我创建了两张表,他们分别是作者表和书籍表,且之间的关系是多对多. # 书 class Book(models.Model): id = models.AutoField(pri ...

随机推荐

  1. php 表单提交大量数据发生丢失的解决方法

    最近在项目中,出现一个奇怪的现象,有一个大form里面有上千个input,提交的时候,老是发现post过来的数据不完整,一开始还怀疑是html 表单名称有冲突,排除掉了.然后,网上找了一堆,php.i ...

  2. c++stack类的用法

    官方解释: LIFO stack Stacks are a type of container adaptor, specifically designed to operate in a LIFO ...

  3. 如何将Bitcoin比特币区块链数据导入关系数据库

    在接触了比特币和区块链后,我一直有一个想法,就是把所有比特币的区块链数据放入到关系数据库(比如SQL Server)中,然后当成一个数据仓库,做做比特币交易数据的各种分析.想法已经很久了,但是一直没有 ...

  4. Linux内存管理 (15)页面迁移

    专题:Linux内存管理专题 关键词:RMAP.页面迁移. 相关章节:反向映射RMAP.内存规整. 页面迁移的初衷是为NUMA系统提供一种将进程迁移到任意内存节点的能力,后来内存规整和内存热插拔场景都 ...

  5. 几行c#代码,轻松搞定一个女大学生

    几行c#代码,轻松搞定一个女大学生 的作业... 哈哈,标题党了哈,但是是真的,在外面敲代码,想赚点外快,接到了一个学生的期末考试,是一个天气预报的程序.程序并不难. 看到这个需求第一个想法就是只要找 ...

  6. 【学习总结】GirlsInAI ML-diary day-9-dict字典

    [学习总结]GirlsInAI ML-diary 总 原博github链接-day9 认识dict字典 新的数据类型dict. dict全称dictionary,在其他语言中也称为map,使用键-值( ...

  7. git branch --set-upstream 本地关联远程分支

    最近使用git pull的时候多次碰见下面的情况: There is no tracking information for the current branch.Please specify whi ...

  8. 第二章· Redis管理实战

    数据类型 管理实战 数据类型 String: 字符串类型 Hash: 哈希类型 List: 列表类型 Set: 集合类型 Sorted set: 顺序集合类型 管理实战 通用操作

  9. MySQL聚簇索引和非聚簇索引的对比

    首先要清楚:聚簇索引并不是一种单独的索引类型,而是一种存储数据的方式. 聚簇索引在实际中用的很多,Innodb就是聚簇索引,Myisam 是非聚簇索引. 在之前我想插入一段关于innodb和myisa ...

  10. Azure - Create your first function using Visual Studio

    Azure Functions lets you execute your code in a serverless environment without having to first creat ...