documentationを定義すると、以下のテーブルが定義されていますが、まだリレーションが定義されていません。Reflectionの後にSQLAlchemyに多対多リレーションシップを追加する
class CountryAssociation(Base):
__tablename__ = 'Country_Region_Mapping'
country_id = Column(Integer, ForeignKey('countries.uid'), primary_key=True)
region_id = Column(Integer, ForeignKey('regions.uid'), primary_key=True)
region = relationship('Region', back_populates='country')
country = relationship('Countries', back_populates='region')
extra_data = Column(String(50))
class Countries(Base):
__tablename__ = 'countries'
uid = Column(Integer, primary_key=True)
countryname = Column('English_short_name',
String(255), unique=True, nullable=False)
region = relationship('CountryAssociation',
back_populates='country')
class Region(Base):
__tablename__ = 'regions'
uid = Column(Integer, primary_key=True)
region = Column(String(255), unique=True, nullable=False)
country = relationship('CountryAssociation',
back_populates='region')
これで、テーブル間に多対多の関係を作成したいと考えています。 docs
Base = automap_base() #reflecting the orm way
engine = create_engine('sqlite:///mydatabse.db')
Base.prepare(engine, reflect=True)
Session = sessionmaker(bind=engine)
session = Session()
table_countries = Base.classes.countries
table_regions = Base.classes.regions
r = session.query(table_regions).filter(table_regions.region == "Western Europe").first()
c = session.query(table_countries).filter(table_countries.English_short_name == "Germany").first()
c.region.append(r) # this fails with
はAttributeErrorは:「国のオブジェクトには、属性 '領域' これは、しかし、作品
ありません:私は私が間違ってここに(初心者)やっているものを得るいけない
c.countryname # Germany
を...
が、それは反射が[関連オブジェクト]で動作しないことは可能ですが(http://docs.sqlalchemy.org/en/ rel_1_1/orm/basic_relationships.html#association-object)? – Bjoern
http://docs.sqlalchemy.org/en/latest/orm/extensions/associationproxy.html#simplifying-association-objectsを見たことがありますか? – plumSemPy
'c.countryname'の動作は非常に奇妙で、クラス定義を元々作成しているときに' Base = automap_base() 'を使用したことを示唆するかもしれません。 –