Python SQLAlchemy中建模的所有关系都必须是双向的吗?

Python SQLAlchemy中建模的所有关系都必须是双向的吗?,python,sqlalchemy,foreign-keys,relational-database,Python,Sqlalchemy,Foreign Keys,Relational Database,我正在学习python和sqlalchemy,并对商店和场所之间的关系进行建模。我得到错误: InvalidRequestError:一个或多个映射程序未能初始化-无法 继续初始化其他映射程序。触发映射器: “Mapper | Shop | Shop”。最初的例外是:Mapper “Mapper | Locale | Locale”没有属性“shop” 当我试图从数据库中检索Lolcle时 from sqlalchemy import Column, ForeignKey, PrimaryKey

我正在学习python和sqlalchemy,并对商店和场所之间的关系进行建模。我得到错误:

InvalidRequestError:一个或多个映射程序未能初始化-无法 继续初始化其他映射程序。触发映射器: “Mapper | Shop | Shop”。最初的例外是:Mapper “Mapper | Locale | Locale”没有属性“shop”

当我试图从数据库中检索Lolcle时

from sqlalchemy import Column, ForeignKey, PrimaryKeyConstraint, String
from sqlalchemy.orm import relationship

    class Shop(maria.Base):
        __tablename__ = 'shop'
        __table_args__ = {'extend_existing': True }

        name = Column(String(25), primary_key=True)
        locale = Column(String, ForeignKey('locale.country'), primary_key=True)
        url = Column(String, nullable=False)

        country = relationship("Locale", back_populates='shop')

        def __repr__(self):
            return "{\n\tname:'%s',\n\tlocale:'%s',\n\turl:'%s'\n}" % (self.name, self.locale, self.url)

    class Locale(maria.Base):
        __tablename__ = 'locale'
        __table_args__ = {'extend_existing': True}

        country = Column(String(50), primary_key=True)
        code = Column(String(11), primary_key=True)

        def __repr__(self):
            return "{\n\tcountry:'%s',\n\tcode:'%s'\n}" % (self.country, self.code)

SQLAlchemy ORM关系不需要是双向的。若使用参数,那个么您就是这样声明的。使用
back\u填充
还需要声明另一端:

采用字符串名称,其含义与
backref
相同,只是互补属性不是自动创建的,而是必须在另一个映射器上显式配置。互补属性还应指示此关系的
back\u填充
,以确保正常运行

(后一种强调)

由于您尚未在另一端声明属性,SQLAlchemy会抱怨。只需删除
back\u populates
参数:

class Shop(maria.Base):
    ...
    country = relationship("Locale")
    ...

SQLAlchemy ORM关系不需要是双向的。若使用参数,那个么您就是这样声明的。使用
back\u填充
还需要声明另一端:

采用字符串名称,其含义与
backref
相同,只是互补属性不是自动创建的,而是必须在另一个映射器上显式配置。互补属性还应指示此关系的
back\u填充
,以确保正常运行

(后一种强调)

由于您尚未在另一端声明属性,SQLAlchemy会抱怨。只需删除
back\u populates
参数:

class Shop(maria.Base):
    ...
    country = relationship("Locale")
    ...

否,省去
后填充
,因为
区域设置
没有“店铺关系”属性。@IljaEverilä尝试过,但仍然得到相同的错误。我应该提到的是,我在iPython口译员中做了所有这些。问题是,你可能在你已经中断的课程中一遍又一遍地重新定义课程。从头开始,删除
后填充的
。@IljaEverilä谢谢。您能将其添加为答案以便我可以接受吗?不,省去
后填充
,因为
区域设置
没有“店铺关系”属性。@IljaEverilä尝试过,但仍然得到相同的错误。我应该提到的是,我在iPython口译员中做了所有这些。问题是,你可能在你已经中断的课程中一遍又一遍地重新定义课程。从头开始,删除
后填充的
。@IljaEverilä谢谢。你能把它作为一个答案,这样我就可以接受了吗?