亿万教师注册平台SQLAlchemy 中干系定义的几个题目 一对一 / 多对多

2016/11/11

题目

官网关于这一部分的讲解, 不是很细致, 尤其是拿 Parent 和 Child 作为比喻, 以为不是很笼统, 我基于自己的理解,写了对应的的 demo, 但是不是很明晰:

  1. 能否符合最佳实际

  2. 能否漏失了某些最佳实际?

我看书, 理解到, 实际消费中, 固然外键可以低落开辟本钱, 但是很多情况下不举荐外键来联络干系, 另有其他办法, 不知这句话的内涵是什么?

相干代码

  • 多对多

from sqlalchemy import create_engine
from sqlalchemy.ext.declarative import declarative_base
from sqlalchemy.orm import sessionmaker
from sqlalchemy import Table, Column, Integer, String, Numeric, DateTime
from sqlalchemy.orm import relationship
from sqlalchemy import ForeignKey

engine = create_enginesqlite:///:memory:
Base = declarative_base
Session = sessionmakerbind=engine
session = Session

class Many1Base:
    __tablename__ = many1
    id = ColumnInteger, primary_key=True, autoincrement=True
    attr1 = ColumnString, nullable=False

    many2 = relationshipMany2, back_populates=many1, secondary=many1_many2_table # 1?? 定义精确?

class Many2Base:
    __tablename__ = many2
    id = ColumnInteger, primary_key=True, autoincrement=True
    attr2 = ColumnString, nullable=False

    many1 = relationshipMany1, back_populates=many2, secondary=many1_many2_table # 2?? 定义精确?

many1_many2_table = Tablemany1_many2, Base.metadata,
                          Columnmany1_id, Integer, ForeignKeymany1.id,
                          Columnmany2_id, Integer, ForeignKeymany2.id                         
          
1. 盘诘 m1 身上统统的 Many2    m1 是 Many1 的实例 
    a. return m1.many2  这种能写吗, 真实这种很直观! Elixir中可以如许写
    b. session.queryMany2.filterMany2.many1 == m1.all
    
2. 定义多对多, 需求额外定义一张联络干系表, 难道没有与日俱增的办法吗?  消费数据库中可不止几张干系表, 都要手写? 
  • 一对一

class One1Base:
    __tablename__ = one1
    id = ColumnInteger, primary_key=True, autoincrement=True
    attr1 = ColumnString, nullable=False
    
    one2 = relationshipOne2, back_populates=one1, uselist=False # 1?? 看官网文档, 只需求添加 uselist 这个参数即可

class One2Base:
    __tablename__ = one2
    id = ColumnInteger, primary_key=True, autoincrement=True
    attr2 = ColumnString, nullable=False
    
    one1_id = ColumnInteger, ForeignKeyone1.id

感激约请。
SQLAchemy的ORM运用上的确没有Django简便。
针多多对多的干系,的确需求与线定义好联络干系表,当联络干系表中需求参加额外字段时,Django也需求定义办理表的Model。

定义很多多少对多的干系后,盘诘是比较方便的。
比方盘诘Many1东西m1对应的统统Many2东西:

  1. 可以直接写:

    return m1.many2 # 前往的是Many2东西的数组

  2. 或许十分冗长的如许盘诘:

    return session.queryMany2.filterMany2.many1.containsm1.all

  3. 另有一种是定义联络干系表Class而不是直接定义办理表,然后直接盘诘联络干系表。

运用你的多对多干系定义示比方下:

if __name__ == __main__:                                                                                                                      
    engine = create_enginesqlite:///:memory:                                                                                                    
    metadata = Base.metadata                                                                                                                        
    metadata.create_allengine                                                                                                                     
                                                                                                                                                      
    Session = sessionmakerbind=engine                                                                                                             
    session = Session                                                                                                                             
    session.add_all[                                                                                                                               
        Many1id=10, attr1=<10>, many2=[                                                                                                          
            Many2id=20, attr2=<20>,                                                                                                             
            Many2id=40, attr2=<40>,                                                                                                             
        ],                                                                                                                                         
        Many1id=11, attr1=<10>, many2=[                                                                                                          
            Many2id=60, attr2=<60>,                                                                                                             
            Many2id=80, attr2=<80>,                                                                                                             
        ],                                                                                                                                         
        Many2id=100, attr2=<100>, many1=[                                                                                                        
            Many1id=12, attr1=<12>,                                                                                                             
            Many1id=13, attr1=<13>,                                                                                                             
            Many1id=14, attr1=<14>,                                                                                                             
        ]                                                                                                                                          
    ]                                                                                                                                              
    session.commit                                                                                                                                
    # 1. Nice query                                                                                                                                 
    print ####Nice query####                                                                                                                      
    m1 = session.queryMany1.get10                                                                                                               
    for m2 in m1.many2:                                                                                                                             
        print m2.id, m2.attr2                                                                                                                       
    # 2. Bad query                                                                                                                                  
    print ####Bad query####                                                                                                                       
    for m2 in session.queryMany2.filterMany2.many1.containsm1.all:                                                                          
        print m2.id, m2.attr2

别的你的1对1的定义中,One2少一个relation:

one1 = relationshipOne1, back_populates=one2

(看完/读完)这篇文章有何感想! 亿万先生注册平台的分享…

发表评论

姓名 *
电子邮件 *
站点