SqlAlchemy Изменение дополнительного поля в объекте ассоциации
У меня возникают проблемы с выяснением того, как я изменил бы значение основного поля в TblEventsContacts из записи события со следующей настройкой базы данных.
import sqlalchemy as sa
from sqlalchemy.ext.declarative import declarative_base
from sqlalchemy.ext.associationproxy import association_proxy
from sqlalchemy import orm
import uuid
Base = declarative_base()
Session = orm.sessionmaker()
Engine = sa.create_engine('sqlite:///arandomdb', echo=True)
Session.configure(bind=Engine)
session = Session()
class TblContactsContacts(Base):
__tablename__ = 'tbl_contacts_contacts'
parent_id = sa.Column(sa.String, sa.ForeignKey('tbl_contacts.guid'), primary_key=True)
child_id = sa.Column(sa.String, sa.ForeignKey('tbl_contacts.guid'), primary_key=True)
class TblEventsEvents(Base):
__tablename__ = 'tbl_events_events'
parent_id = sa.Column(sa.String, sa.ForeignKey('tbl_events.guid'), primary_key=True)
child_id = sa.Column(sa.String, sa.ForeignKey('tbl_events.guid'), primary_key=True)
class TblEvents(Base):
__tablename__ = 'tbl_events'
guid = sa.Column(sa.String(36), primary_key=True, nullable=False)
name = sa.Column(sa.String)
children = orm.relationship('TblEvents',
secondary='tbl_events_events',
primaryjoin='TblEvents.guid==TblEventsEvents.parent_id',
secondaryjoin='TblEvents.guid==TblEventsEvents.child_id',
)
contacts = orm.relationship('TblContacts', secondary='tbl_events_contacts', backref='events')
class TblContacts(Base):
__tablename__ = 'tbl_contacts'
guid = sa.Column(sa.String(36), primary_key=True, nullable=False)
name = sa.Column('contact', sa.String)
children = orm.relationship('TblContacts',
secondary='tbl_contacts_contacts',
primaryjoin='TblContacts.guid==TblContactsContacts.parent_id',
secondaryjoin='TblContacts.guid==TblContactsContacts.child_id',
)
class TblEventsContacts(Base):
__tablename__ = 'tbl_events_contacts'
event_id = sa.Column(sa.String, sa.ForeignKey(TblEvents.guid), primary_key=True)
contact_id = sa.Column(sa.String, sa.ForeignKey(TblContacts.guid), primary_key=True)
primary = sa.Column(sa.Boolean)
event = orm.relationship('TblEvents',
backref=orm.backref('contacts_assoc',
passive_deletes='all'
))
contact = orm.relationship('TblContacts',
backref=orm.backref('events_assoc',
passive_deletes='all'))
if __name__ == '__main__':
Base.metadata.create_all(Engine)
ev1 = TblEvents(guid=str(uuid.uuid4()), name='event 1')
con1 = TblContacts(guid=str(uuid.uuid4()), name='contact 1')
session.add(ev1, con1)
session.commit()
ev1.contacts.append(con1)
session.commit()
Я чувствую, что это самое близкое, что я получил.
ev1.contacts[0].events_assoc.primary = True
session.commit()
Нужно ли использовать запрос или есть способ сделать это в orm? Когда я это делаю, он не жалуется, но ничего не делает. Так что я не уверен, куда идти отсюда.
1 ответ
Ух ты, я был ближе, чем думал. Это закончилось тем, что это.
ev1.contacts[0].events_assoc[0].primary = True
session.commit()
Просто отсутствует указатель индекса после events_assoc