2016-10-15 11 views
0

私はPythonアプリケーションでSQLAlchemyを使用しようとしていますが、多対多の関係に問題があります。 私は4つのテーブルを有する:SqlAlchemyとの結合条件のエラー

ユーザー、フラグ、commandes、チャネル、および

commandes_channels_flags各関係テーブル(commandes、チャネルおよびフラグ)

ユーザの外部キーを含むcommandes_channels_flags flag_idなどを有しています外部キーも。

私はコマンド、チャンネル、フラグをリンクしようとします。目的は、コマンドがフラグのためにチャネル上で実行できることを知ることです。

私はこれでした:

from sqlalchemy import Column, Integer, String, ForeignKey 
from sqlalchemy.ext.declarative import declarative_base 
from sqlalchemy.orm import relationship 

Base = declarative_base() 


class User(Base): 
    __tablename__ = 'users' 

    id = Column(Integer, primary_key=True) 
    pseudo = Column(String(50), unique=True, nullable=False) 
    flag_id = Column(ForeignKey('flags.id')) 


class Flag(Base): 
    __tablename__ = 'flags' 

    id = Column(Integer, primary_key=True) 
    irc_flag = Column(Integer) 
    nom = Column(String(50)) 

    users = relationship("User", backref="flag", order_by="Flag.irc_flag") 
    commande = relationship("Commande", secondary="commandes_channels_flags", back_populates="flags") 
    channel = relationship("Channel", secondary="commandes_channels_flags", back_populates="flags") 


class Channel(Base): 
    __tablename__ = 'channels' 

    id = Column(Integer, primary_key=True) 
    uri = Column(String(50)) 
    topic = Column(String(255)) 

    commande = relationship("Commande", secondary="commandes_channels_flags", back_populates="channels") 
    flag = relationship("Flag", secondary="commandes_channels_flags", back_populates="channels") 


class Commande(Base): 
    __tablename__ = 'commandes' 

    id = Column(Integer, primary_key=True) 
    pattern = Column(String(50)) 

    channel = relationship("Channel", secondary="commandes_channels_flags", back_populates="commandes") 
    flag = relationship("Flag", secondary="commandes_channels_flags", back_populates="commandes") 


class CommandeChannelFlag(Base): 
    __tablename__ = 'commandes_channels_flags' 

    id = Column(Integer, primary_key=True) 
    commande_id = Column(ForeignKey('commandes.id')) 
    channel_id = Column(ForeignKey('channels.id')) 
    flag_id = Column(ForeignKey('flags.id')) 

をしかし、私はこのエラーを持っている:

sqlalchemy.exc.InvalidRequestError: Mapper 'Mapper|Commande|commandes' has no property 'channels' 

私はリンク私のテーブルに誤りがあることを理解し、私はそれを見つけることができません。

+0

'channel_id = Column(ForeignKey( 'chanels.id'))' – xli

+0

ああ、変更しましたが別のエラーがあります(メッセージ編集済み) – Tartempion34

答えて

1

back_populatesは、他のモデルの関連プロパティの正確な名前と一致する必要があります。 Channelでは、あなたはback_populates="channels"を持っていますが、Commandeでは、あなたが持っている:

channel = relationship("Channel", secondary="commandes_channels_flags", back_populates="commandes") 

代わりに、channels = relationshipchannel = relationshipを変更します。

また、あなたのback_populates引数を一致させるためにFlag.commandesFlag.channelsChannel.commandesChannel.flags、およびCommande.flagsに他の関係のプロパティを変更する必要があります。

+0

ありがとうございます答え。私は第二の部分を理解していない。どのプロパティを変更する必要がありますか? – Tartempion34

+0

''コマンド 'は 'フラグ'で ''コマンド'を行い、 ''フラグ 'では' 'チャンネルに' 'をかけます。 – xli

+0

はい私はそれをしましたが、他の関係プロパティも変更する必要があると言うとき、最初のパラメータについて話しますか? (例:Commande.flags、secondary = "commandes_channels_flags"、back_populates = "flags") – Tartempion34