• pythonのsqlalchemy多对多关系


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

    1. 一本书可以有好几个作者一起出版
    2. 一个作者可以写好几本书
     1 #!/usr/bin/env python
     2 from sqlalchemy import Table,Column,Integer,String,DATE,ForeignKey
     3 from sqlalchemy.orm import relationship
     4 from sqlalchemy.ext.declarative import declarative_base
     5 from sqlalchemy import create_engine
     6 from sqlalchemy.orm import sessionmaker
     7 
     8 
     9 engine = create_engine("mysql+pymysql://root:root@localhost/testuser?charset=utf8",encoding="utf-8",echo=True)
    10 # 生成orm基类
    11 Base = declarative_base()
    12 
    13 
    14 # 创建表映射
    15 book_m2m_author = Table("book_m2m_author",Base.metadata,
    16                         Column("book_id",Integer,ForeignKey("books.id")),
    17                         Column("author_id",Integer,ForeignKey("authors.id")))
    18 
    19 class Book(Base):
    20     __tablename__ = "books"
    21     id = Column(Integer,primary_key=True)
    22     name = Column(String(64))
    23     pub_date = Column(DATE)
    24     authors = relationship("Author",secondary=book_m2m_author,backref="books")
    25 
    26     def __repr__(self):
    27         return self.name
    28 
    29 class Author(Base):
    30     __tablename__ = "authors"
    31     id = Column(Integer,primary_key=True)
    32     name = Column(String(32))
    33 
    34     def __repr__(self):
    35         return self.name
    36 
    37 # 构建表结构
    38 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()
     1 C:UsersAdministratorAppDataLocalProgramsPythonPython37python.exe D:/PythonStudy/charm/01/day12/orm_m2m_aip.py
     2 2018-09-20 09:22:14,652 INFO sqlalchemy.engine.base.Engine SHOW VARIABLES LIKE 'sql_mode'
     3 2018-09-20 09:22:14,652 INFO sqlalchemy.engine.base.Engine {}
     4 2018-09-20 09:22:14,656 INFO sqlalchemy.engine.base.Engine SELECT DATABASE()
     5 2018-09-20 09:22:14,656 INFO sqlalchemy.engine.base.Engine {}
     6 2018-09-20 09:22:14,656 INFO sqlalchemy.engine.base.Engine show collation where `Charset` = 'utf8mb4' and `Collation` = 'utf8mb4_bin'
     7 2018-09-20 09:22:14,656 INFO sqlalchemy.engine.base.Engine {}
     8 C:UsersAdministratorAppDataLocalProgramsPythonPython37libsite-packagespymysqlcursors.py:170: Warning: (1366, "Incorrect string value: '\xD6\xD0\xB9\xFA\xB1\xEA...' for column 'VARIABLE_VALUE' at row 484")
     9   result = self._query(query)
    10 2018-09-20 09:22:14,658 INFO sqlalchemy.engine.base.Engine SELECT CAST('test plain returns' AS CHAR(60)) AS anon_1
    11 2018-09-20 09:22:14,658 INFO sqlalchemy.engine.base.Engine {}
    12 2018-09-20 09:22:14,658 INFO sqlalchemy.engine.base.Engine SELECT CAST('test unicode returns' AS CHAR(60)) AS anon_1
    13 2018-09-20 09:22:14,658 INFO sqlalchemy.engine.base.Engine {}
    14 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
    15 2018-09-20 09:22:14,659 INFO sqlalchemy.engine.base.Engine {}
    16 2018-09-20 09:22:14,660 INFO sqlalchemy.engine.base.Engine DESCRIBE `book_m2m_author`
    17 2018-09-20 09:22:14,660 INFO sqlalchemy.engine.base.Engine {}
    18 2018-09-20 09:22:14,661 INFO sqlalchemy.engine.base.Engine DESCRIBE `books`
    19 2018-09-20 09:22:14,661 INFO sqlalchemy.engine.base.Engine {}
    20 2018-09-20 09:22:14,663 INFO sqlalchemy.engine.base.Engine DESCRIBE `authors`
    21 2018-09-20 09:22:14,663 INFO sqlalchemy.engine.base.Engine {}
    22 2018-09-20 09:22:14,668 INFO sqlalchemy.engine.base.Engine BEGIN (implicit)
    23 2018-09-20 09:22:14,668 INFO sqlalchemy.engine.base.Engine SELECT authors.id AS authors_id, authors.name AS authors_name 
    24 FROM authors 
    25 WHERE authors.name = %(name_1)s 
    26  LIMIT %(param_1)s
    27 2018-09-20 09:22:14,669 INFO sqlalchemy.engine.base.Engine {'name_1': 'Jerry', 'param_1': 1}
    28 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 
    29 FROM books, book_m2m_author 
    30 WHERE %(param_1)s = book_m2m_author.author_id AND books.id = book_m2m_author.book_id
    31 2018-09-20 09:22:14,670 INFO sqlalchemy.engine.base.Engine {'param_1': 1}
    32 [Java从入门到精通, JavaScript从入门到精通, .Net从入门到精通]
    33 2018-09-20 09:22:14,675 INFO sqlalchemy.engine.base.Engine COMMIT
    34 
    35 Process finished with exit code 0
  • 相关阅读:
    DriveInfo 类 提供对有关驱动器的信息的访问
    遍历数组 例子
    怎么判断点击dataGridView1的是第几列
    无法加载协定为“ServiceReference1.LanguageService”的终结点配置部分,因为找到了该协定的多个终结点配置。请按名称指示首选的终结点配置部分。
    c#面试题及答案(一)
    SQL杂谈 ,有你想要的...
    TextView和Button的学习
    GitHub的学习和使用
    App的布局管理
    EditText制作简单的登录界面
  • 原文地址:https://www.cnblogs.com/pengpengzhang/p/9679839.html
Copyright © 2020-2023  润新知