Hi,

many thanks for help, i had feeling it can be something simple, but was
overlooking this permanently.

Have nice day
Jano

On Thu, Apr 25, 2019 at 6:04 PM Mike Bayer <mike...@zzzcomputing.com> wrote:

> oh nevermind, this is a simple issue:
>
>     patches = association_proxy(
>         "patches", "patch", creator=lambda p: Server2Patch(patch=p)
>     )
>
>
> conflicts with:
>
>     request_server = relationship(
>         "Request2Server",
>         backref=backref("patches"),
>         foreign_keys=[
>             request2server_request_id_fk,
>             request2server_server_ip_fk,
>         ],
>     )
>
>
> it is overwriting the "patches" relationship.    Change to:
>
>     patches = association_proxy(
>         "_patches", "patch", creator=lambda p: Server2Patch(patch=p)
>     )
>
>     request_server = relationship(
>         "Request2Server",
>         backref=backref("_patches"),
>         foreign_keys=[
>             request2server_request_id_fk,
>             request2server_server_ip_fk,
>         ],
>     )
>
> the association proxy should raise for this condition, e.g. pointing
> it to itself.
>
>
> On Thu, Apr 25, 2019 at 11:00 AM Mike Bayer <mike...@zzzcomputing.com>
> wrote:
> >
> > On Thu, Apr 25, 2019 at 8:34 AM Jan Sakalos <sakal...@gmail.com> wrote:
> > >
> > > Hello,
> > >
> > > I have to association proxies in code one is working and other not. I
> went through it many times and wasnt able to identify issue.
> > > Also please can you give me advice how to debug such issues if there
> is any?
> >
> > The error is that a backref is not being located, which normally has
> > nothing to do with the association proxies.   However it's not clear
> > if the association proxies are getting in the way of the
> > relationships.
> >
> > The first step would be to run your operation without using the
> > association proxies, that is, create the Server2Patch object manually
> > and append it as though the association proxies weren't there.
> >
> > Unfortunately I can't visually see how the error would occur which
> > means it is quite possible that some very unlikely interaction is
> > going on that can't be easily guessed, so I'll have to run it.
> >
> > >
> > > Thanks
> > > Jano
> > >
> > > code:
> > >
> > >
> > > from sqlalchemy import Column, Integer, String, ForeignKey, DateTime,
> Time, ForeignKeyConstraint, and_, create_engine
> > > from sqlalchemy.ext.associationproxy import association_proxy
> > > from sqlalchemy.ext.declarative import declared_attr, declarative_base
> > > from sqlalchemy.orm import relationship, backref, sessionmaker
> > >
> > > engine_qualys = create_engine('mysql+pymysql://qualys:123456@localhost
> /sqlalchemy_test')
> > > Base = declarative_base()
> > > Base.metadata.create_all(engine_qualys)
> > >
> > >
> > > Session = sessionmaker(bind=engine_qualys)
> > >
> > >
> > > class BaseMixin():
> > >
> > >     @declared_attr
> > >     def __tablename__(cls):
> > >         return cls.__name__.lower()
> > >
> > >     def __repr__(self):
> > >         values = ', '.join("%s=%r" % (n, getattr(self, n)) for n in
> self.__table__.c.keys())
> > >         return "%s(%s)" % (self.__class__.__name__, values)
> > >
> > >
> > > class Request(BaseMixin, Base):
> > >     id = Column(Integer, primary_key=True)
> > >     ip = Column(String(30))
> > >
> > >     #working
> > >     servers = association_proxy('request_servers', 'server',
> creator=lambda server: Request2Server(server=server))
> > >
> > >
> > > class Server(BaseMixin, Base):
> > >     ip = Column(String(30), primary_key=True, autoincrement=False)
> > >
> > >
> > > class Request2Server(BaseMixin, Base):
> > >     request_id_fk = Column(Integer, ForeignKey('request.id'),
> primary_key=True)
> > >     server_ip_fk = Column(String(30), ForeignKey('server.ip'),
> primary_key=True)
> > >     data = Column(String(30))
> > >
> > >     request = relationship('Request',
> backref=backref('request_servers'))
> > >     server = relationship('Server', backref=backref('server_requests'))
> > >
> > >     #not working
> > >     patches = association_proxy('patches', 'patch', creator=lambda p:
> Server2Patch(patch=p))
> > >
> > >
> > > class Patch(BaseMixin, Base):
> > >     qid = Column(Integer, primary_key=True)
> > >
> > >
> > > class Server2Patch(BaseMixin, Base):
> > >     request2server_request_id_fk = Column(Integer,
> ForeignKey('request2server.request_id_fk'), primary_key=True)
> > >     request2server_server_ip_fk = Column(String(30),
> ForeignKey('request2server.server_ip_fk'), primary_key=True)
> > >     patch_qid_fk = Column(Integer, ForeignKey('patch.qid'),
> primary_key=True)
> > >
> > >     request_server = relationship('Request2Server',
> backref=backref('patches'), foreign_keys=[request2server_request_id_fk,
> request2server_server_ip_fk])
> > >     patch = relationship('Patch',
> backref=backref('request_servers2patch'), foreign_keys=[patch_qid_fk])
> > >
> > >     __table_args__ =
> (ForeignKeyConstraint([request2server_request_id_fk,
> request2server_server_ip_fk],
> > >
> [Request2Server.request_id_fk, Request2Server.server_ip_fk]),
> > >                       {})
> > >
> > >
> > > Base.metadata.create_all(engine_qualys)
> > >
> > > s = Session()
> > >
> > > #generating some data
> > > request1 = Request(scan_title='tttt', ip='1.1.1.1,2.2.2.2')
> > > server1 = Server(ip='1.1.1.1')
> > > server2 = Server(ip='2.2.2.2')
> > > request1.servers.append(server1)
> > > request1.servers.append(server2)
> > > request1_server1 = request1.request_servers[0]
> > > patch1 = Patch(qid=1)
> > > s.add_all([request1, server1, server2, patch1])
> > > s.commit()
> > >
> > > #this is not working
> > > request1_server1.patches.append(patch1):
> > >
> > > Traceback (most recent call last):
> > >   File "<input>", line 1, in <module>
> > >   File
> "/home/saki/PycharmProjects/sqlalchemy_test/venv/lib64/python3.7/site-packages/sqlalchemy/orm/collections.py",
> line 1113, in append
> > >     item = __set(self, item, _sa_initiator)
> > >   File
> "/home/saki/PycharmProjects/sqlalchemy_test/venv/lib64/python3.7/site-packages/sqlalchemy/orm/collections.py",
> line 1078, in __set
> > >     item = executor.fire_append_event(item, _sa_initiator)
> > >   File
> "/home/saki/PycharmProjects/sqlalchemy_test/venv/lib64/python3.7/site-packages/sqlalchemy/orm/collections.py",
> line 715, in fire_append_event
> > >     self.owner_state, self.owner_state.dict, item, initiator
> > >   File
> "/home/saki/PycharmProjects/sqlalchemy_test/venv/lib64/python3.7/site-packages/sqlalchemy/orm/attributes.py",
> line 1134, in fire_append_event
> > >     value = fn(state, value, initiator or self._append_token)
> > >   File
> "/home/saki/PycharmProjects/sqlalchemy_test/venv/lib64/python3.7/site-packages/sqlalchemy/orm/attributes.py",
> line 1444, in emit_backref_from_collection_append_event
> > >     child_impl = child_state.manager[key].impl
> > > KeyError: 'request_server'
> > >
> > >
> > > --
> > > SQLAlchemy -
> > > The Python SQL Toolkit and Object Relational Mapper
> > >
> > > http://www.sqlalchemy.org/
> > >
> > > To post example code, please provide an MCVE: Minimal, Complete, and
> Verifiable Example. See http://stackoverflow.com/help/mcve for a full
> description.
> > > ---
> > > You received this message because you are subscribed to the Google
> Groups "sqlalchemy" group.
> > > To unsubscribe from this group and stop receiving emails from it, send
> an email to sqlalchemy+unsubscr...@googlegroups.com.
> > > To post to this group, send email to sqlalchemy@googlegroups.com.
> > > Visit this group at https://groups.google.com/group/sqlalchemy.
> > > For more options, visit https://groups.google.com/d/optout.
>
> --
> SQLAlchemy -
> The Python SQL Toolkit and Object Relational Mapper
>
> http://www.sqlalchemy.org/
>
> To post example code, please provide an MCVE: Minimal, Complete, and
> Verifiable Example.  See  http://stackoverflow.com/help/mcve for a full
> description.
> ---
> You received this message because you are subscribed to the Google Groups
> "sqlalchemy" group.
> To unsubscribe from this group and stop receiving emails from it, send an
> email to sqlalchemy+unsubscr...@googlegroups.com.
> To post to this group, send email to sqlalchemy@googlegroups.com.
> Visit this group at https://groups.google.com/group/sqlalchemy.
> For more options, visit https://groups.google.com/d/optout.
>

-- 
SQLAlchemy - 
The Python SQL Toolkit and Object Relational Mapper

http://www.sqlalchemy.org/

To post example code, please provide an MCVE: Minimal, Complete, and Verifiable 
Example.  See  http://stackoverflow.com/help/mcve for a full description.
--- 
You received this message because you are subscribed to the Google Groups 
"sqlalchemy" group.
To unsubscribe from this group and stop receiving emails from it, send an email 
to sqlalchemy+unsubscr...@googlegroups.com.
To post to this group, send email to sqlalchemy@googlegroups.com.
Visit this group at https://groups.google.com/group/sqlalchemy.
For more options, visit https://groups.google.com/d/optout.

Reply via email to