sqlalchemy 1.3.23 связь с императивным отображением

#sqlalchemy #relationship

Вопрос:

Как реализовать взаимосвязь с помощью классического сопоставления? sqlalchemy версии 1.3.23. Упрощенная версия того, что я пробовал:

 users_table = Table(
    "users",
    metadata,
    Column("id", Integer, primary_key=True),
    Column("username", String, nullable=False, unique=True),
)

markets_table = Table(
    "markets",
    metadata,
    Column("id", Integer, primary_key=True),
    Column("type", Enum(MarketTypes), nullable=False),
    Column("status", Boolean, server_default="True"),
    Column("user_id", ForeignKey("users.id"), nullable=False),
)

class User(object):
    def __init__(self, id, username):
        self.id = id,
        self.username = username

class Market(object):
    def __init__(self, id, type, status, user_id):
        self.id = id,
        self.type = type,
        self.status = status,
        self.user_id = user_id

mapper(Market, markets_table)

mapper(User, users_table, properties={"markets": relationship(markets_table, primaryjoin=users_table.c.id == markets_table.c.user_id)})

 

Проблема в том, что я не могу получить users_table.c.markets

Я нашел несколько вопросов на эту тему в stackoverflow, но ни один из них не смог мне помочь

Ответ №1:

Чтобы получить доступ к сопоставленному свойству, вы должны сделать это из класса, а не из таблицы, поэтому вместо того, чтобы вызывать его как:

 users_table.c.markets
 

вы должны назвать это так:

 User.markets from an instance of the user 
 

То, что вы пытались, было в основном доступом к рынку столбцов в таблице пользователей, которого не существует.

Дайте мне знать, если это поможет!

Комментарии:

1. Спасибо. Это опечатка в тексте. Я пробовал разные варианты и запутался при копировании.