2016/11/11
問題
官網(wǎng)關(guān)于這一部分的講解, 不是很詳細(xì), 尤其是拿 Parent 和 Child 作為比喻, 感覺不是很形象, 我基于自己的理解,寫了對應(yīng)的的 demo, 但是不是很清楚:
是否符合最佳實踐
是否漏掉了某些最佳實踐?
我看書, 了解到, 實際生產(chǎn)中, 雖然外鍵可以降低開發(fā)成本, 但是許多情況下不推薦外鍵來關(guān)聯(lián), 另有其他方法, 不知這句話的內(nèi)涵是什么?
相關(guān)代碼
多對多
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_engine('sqlite:///:memory:')
Base = declarative_base()
Session = sessionmaker(bind=engine)
session = Session()
class Many1(Base):
__tablename__ = 'many1'
id = Column(Integer, primary_key=True, autoincrement=True)
attr1 = Column(String, nullable=False)
many2 = relationship('Many2', back_populates='many1', secondary=many1_many2_table) # 1?? 定義正確?
class Many2(Base):
__tablename__ = 'many2'
id = Column(Integer, primary_key=True, autoincrement=True)
attr2 = Column(String, nullable=False)
many1 = relationship('Many1', back_populates='many2', secondary=many1_many2_table) # 2?? 定義正確?
many1_many2_table = Table('many1_many2', Base.metadata,
Column('many1_id', Integer, ForeignKey('many1.id')),
Column('many2_id', Integer, ForeignKey('many2.id')))
1. 查詢 m1 身上所有的 Many2 ( m1 是 Many1 的實例 )
a. return m1.many2 這種能寫嗎, 其實這種很直觀! Elixir中能夠這樣寫
b. session.query(Many2).filter(Many2.many1 == m1).all()
2. 定義多對多, 需要額外定義一張關(guān)聯(lián)表, 難道沒有一勞永逸的辦法嗎? ( 生產(chǎn)數(shù)據(jù)庫中可不止幾張關(guān)系表, 都要手寫? )
一對一
class One1(Base):
__tablename__ = 'one1'
id = Column(Integer, primary_key=True, autoincrement=True)
attr1 = Column(String, nullable=False)
one2 = relationship('One2', back_populates='one1', uselist=False) # 1?? 看官網(wǎng)文檔, 只需要添加 uselist 這個參數(shù)即可
class One2(Base):
__tablename__ = 'one2'
id = Column(Integer, primary_key=True, autoincrement=True)
attr2 = Column(String, nullable=False)
one1_id = Column(Integer, ForeignKey('one1.id'))
添加回答
舉報
0/150
提交
取消