MySQL, SQLAlchemyで多対多のテーブルの関連付けを行なう場合、外部キー等を用いて、自動的に(?)データ同士が関連付けされる方法があるかと思いますが、以下のコードの様に、外部キー等の自動的に関連付けをせずに、中間テーブルを都度自分で作成し、利用する方法は問題あるでしょうか? このプログラムによる方法でも実際に動作しますし、テスト段階では不都合を感じません。。
自動的な関連付けは便利な面も多いとは思いますが、「必要」では無い様に思うのですが、以下のコードの考え方では何か不具合が出てくるものでしょうか。また、自動的なrelationの設定による方法と、下記の様な手動での中間テーブルの設定の方法でのメリット、デメリットがあれば教えて下さい。
class Menu(Base): __tablename__ = 'menu_table' id = Column(Integer,primary_key=True, autoincrement=True) menu_name = Column(String(100),nullable=False) class Zairyou(Base): __tablename__ = 'zairyou_table' id = Column(Integer,primary_key=True, autoincrement=True) zairyou_name = Column(String(100),nullable=False) class MenuZairyou(Base): __tablename__ = 'menu_zairyou_relationtable' menu_id = Column(Integer, primary_key=True) zairyou_id = Column(Integer,primary_key=True) def main(): engine = create_engine('mysql+pymysql://{user}:{password}@{host}/{db_name}?charset=utf8'.format(**{ 'user' : "root", 'password' : "password", # localのMySQLはrootpasswordは無しにしてある 'host' : "localhost", 'db_name' : "relation_studydb" }) ) Base.metadata.create_all(engine) SessionMaker = sessionmaker(bind=engine) session = SessionMaker() # 初めにmenu_tableとzairyou_tableへの登録を行う new_menu = Menu(menu_name="ガパオライス") session.add(new_menu) new_zairyou = Zairyou(zairyou_name='鶏肉') session.add(new_zairyou) session.commit() # 登録した料理のidを準備 register_menu = session.query(Menu).order_by(-Menu.id).first() # 材料のidを準備 register_zairyou = session.query(Zairyou).order_by(-Zairyou.id).first() # menu_zairyou_relationtable への登録 register_to_MenuZairyou = MenuZairyou(menu_id = register_menu.id, zairyou_id = register_zairyou.id) session.add(register_to_MenuZairyou) session.commit() # 2つの目の材料と登録 new_zairyou = Zairyou(zairyou_name='バジル') session.add(new_zairyou) session.commit() register_zairyou = session.query(Zairyou).order_by(-Zairyou.id).first() # menu_zairyou_relationtable への登録 register_to_MenuZairyou = MenuZairyou(menu_id = register_menu.id, zairyou_id = register_zairyou.id) session.add(register_to_MenuZairyou) session.commit() if __name__ == '__main__': main()
回答1件
あなたの回答
tips
プレビュー
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
2020/09/29 07:30
2020/09/29 09:01
2020/09/29 09:17 編集