Левое соединение, когда нет первичного ключа (клей 2 задает запросы одному, если это возможно)

В игре есть два простых объекта: «Игрок» и «Альянс», и мне нужно забрать всех пользователей одной и той же нации с именем альянса (если они в любом альянсе получат имя, иначе имя альянса равно null).

class Base(object):
     def __tablename__(self):
       return self.__name__.lower()

     id = Column(Integer, primary_key=True, nullable=False)

class PlayerModel(Base):
    __tablename__ = 'players'
    alliances_id = Column(Integer, nullable=True)
    username = Column(String(30), nullable=False)
    nation = Column(String(20), nullable=False)
    score = Column(String(20), default=0)

class AllianceModel(Base):
    __tablename__ = 'alliances'
    name = Column(String(50), nullable=False)
    nation = Column(String(20), nullable=False)


//query

for player in session.query(PlayerModel).filter(PlayerModel.nation.like(nation)):
    alliance =session.query(AllianceModel).filter(AllianceModel.id==player.alliance_id).first()
    result.append({'username':player.username, 'alliance':alliance.name})

Могу ли я подключить это только к одному запросу? (Я знаю, что используйте join, когда есть внешний ключ, но игрок может быть вне любого альянса, а alliances_id может быть нулевым).

0
nl ja de
@MartijnPieters Наследует идентификатор базового столбца
добавлено автор PaolaJ., источник
@MartijnPieters Я думал, что внешний ключ
добавлено автор PaolaJ., источник
В вашем AllianceModel отсутствует определение для id . Это просто отношения «один-ко-многим», что заставляет вас думать, что это не сработает?
добавлено автор Martijn Pieters, источник
Ах, действительно, пропустил это. Итак, у этого есть первичный ключ, поэтому нормальные отношения будут Just Work.
добавлено автор Martijn Pieters, источник

1 ответы

Пометьте столбец alliances_id в качестве внешнего ключа:

from sqlalchemy import ForeignKey
from sqlalchemy.orm import relationship

class PlayerModel(Base):
    __tablename__ = 'players'
    alliances_id = Column(Integer, nullable=True, ForeignKey('AllianceModel.id'))
    alliance = relationship('AllianceModel')
    username = Column(String(30), nullable=False)
    nation = Column(String(20), nullable=False)
    score = Column(String(20), default=0)

Затем просто обратитесь к player.alliance :

for player in session.query(PlayerModel).filter(PlayerModel.nation.like(nation)):
    result.append({'username':player.username, 'alliance': player.aliance.name if player.aliance is not None else ''})

Если вы не хотите или не можете добавить ограничение ForeignKey() на alliances_id , вы также можете добавить эту информацию в объявление relationship() :

    alliances_id = Column(Integer, nullable=True)
    alliance = relationship('AllianceModel', foreign_keys='AllianceModel.id')
1
добавлено
@PaolaJ .: Хмм, я, возможно, неправильно понял там документацию. Попробуйте просто строку вместо списка.
добавлено автор Martijn Pieters, источник
Python
Python
7 654 участник(ов)

Уютный чат для профессионалов, занимающихся поиском питоньих мудростей. Как не получить бан: https://t.me/ru_python/577926

Python beginners
Python beginners
4 449 участник(ов)

Вопросы про Python для чайников. Cпам и троллинг неприемлем. Не злоупотребляйте стикерами. Частозадаваемые вопросы: https://github.com/ru-python-beginners/faq/blob/master/README.md Статистика тут: https://grstats.me/chat/x4qym2k5uvfkr3al6at7

pro.python
pro.python
1 090 участник(ов)

Сообщество разработчиков под Python Создатель: @rodgelius

Rude Python
Rude Python
971 участник(ов)

Python без „девочек”, здесь матерятся и унижают Django. Not gay friendly. Правила: t.me/rudepython/114107 @rudepython | t.me/rudepython

SqlCom.ru - Стиль жизни SQL
SqlCom.ru - Стиль жизни SQL
908 участник(ов)

Правила чата - https://t.me/sqlcom/88269 @sqlcom - основной канал (только MS SQL) @sql_ninja - второй канал (SQL вопросы начального уровня и свободное общение) @Gopnegbot - Викторина по SQL Server (наберите в привате /quiz). Предложения в @sql_ninja

rupython
rupython
509 участник(ов)

Группа создана с целью оперативного получения ответов на возникающие вопросы по разработке на яп python, смежные темы, а также человеческого общения. Приветствую!

SQL_Ninja
SQL_Ninja
340 участник(ов)

Правила чата - https://t.me/sqlcom/88269 @sqlcom - основной канал (только SQL) @sql_ninja - второй канал (SQL вопросы начального уровня и свободное общение) @Gopnegbot - Викторина по SQL Server (наберите в привате /quiz)

Python-programming
Python-programming
266 участник(ов)

Чат группы вконтакте https://vk.com/python_community