ORM: принудительное соединение слева по умолчанию - PullRequest
0 голосов
/ 24 июня 2019

Я хочу иметь две таблицы, связанные с внешними ключами. Я хочу установить левое соединение как поведение по умолчанию, когда я вызываю sqlalchemy.select ([table1, table2]). В текущем коде я получаю внешнее соединение, и проблема заключается в том, что мне нужно взаимно-однозначное отношение с левым соединением, которое должно привести к тому, что только две строки команды sqlalchemy.select([table1, table2]), если table1 и table2 также имеют 2 строки, но теперь я получаю четыре строки.

Я прочитал базовый и расширенный учебник по внешним ключам и соединениям sqlalchemy, но все еще не могу понять это. Я также прочитал, что мне нужно LEFT JOIN в запросе, даже если у меня есть внешние ключи, это правильно, даже с sqlalchemy?

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


#create db, session, base
engine = create_engine('sqlite:///:memory:')

Base = declarative_base()

Session = sessionmaker(bind=engine)
session = Session()


#create tables
class Parent(Base):
    __tablename__ = 'parent'
    id = Column(Integer, primary_key=True)
    name_p = Column(String)
    child = relationship("Child", uselist=False, backref="parent")

class Child(Base):
    __tablename__ = 'child'
    id = Column(Integer, primary_key=True)
    name_c = Column(String)
    parent_id = Column(Integer, ForeignKey('parent.id'))

Base.metadata.create_all(engine)


#fill tables with data
joe1 = Child(name_c='joe1')
jane1 = Parent(name_p='jane1', child=joe1)
joe2 = Child(name_c='joe2')
jane2 = Parent(name_p='jane2', child=joe2)

session.add_all([joe1, joe2, jane1, jane2])
session.commit()```
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...