Hi all

I've updated an old sql alchemy powered application and I'm struggling with 
a relationship issue.

Having this code:

class Member(object):
  _data_provider = inject.attr(DataProvider)

  def __init__(self, id_member=None, name=None):
    self.id_member = id_member
    self.name = name

     self.alocs = []

  *def save(self):*

*     auto_projects = self._data_provider.list_projects_aloc_auto()*
*     self.alocs = [Aloca(project_id=project.id, member.id=self.id, 
date=datetime.datetime.now()) for project in auto_projects]*
*     self._data_provider.save_member(self)*

class Project(object):
  _data_provider = inject.attr(DataProvider)

  def __init__(self, id, name):
     self.id = id
     self.name = name
     self.places = []

class Aloc(object):
  _data_provider = inject.attr(DataProvider)
  def __init__(self, id, id_project, date):
     self.id = id
     self.id_project = id_project
     self.date = date

class AutoAloc(Aloc):
  pass

class Manager(Aloc):
  pass

from sqlalchemy.schema import MetaData, Table, Column, ForeignKey
class DataProvider(object):
  _metadata = MetaData()
  _engine = None
  _SessionFactory = sessionmaker(expire_on_commit=False) # Factory de 
sessões
  
  def _map_aloc(self):
    alocs = Table("aloc", self._metadata,
      Column("id", Integer, primary_key=True),
      Column("id_project", Integer, ForeignKey("project.id")),
      Column("date", DateTime),
      mysql_engine='InnoDB',
      mysql_charset='utf8')
      return mapper(Aloc, alocs,
          polymorphic_on=alocs.c.type,
          polymorphic_identity="aloc",
      )

  def _map_manager(self, aloc_mapper):
     return mapper(Manager, inherits=aloc_mapper, 
polymorphic_identity='manager')

  def _map_aloc_auto(self, aloc_mapper):
     return mapper(AlocAuto, inherits=alocacao_mapper, 
polymorphic_identity='alocauto')

   def _map_project(self):
      projects = Table("project", self._metadata,
         Column("id", Integer, primary_key=True),
         Column("name", String(255)),
         mysql_engine='InnoDB',
         mysql_charset='utf8')
     
         return mapper(Project, projects,
              "managers": relationship(Manager),
               "alocs": relationship(Aloc, backref="project", cascade="all, 
delete-orphan")})
  
  def _map_member(self):
     members = Table("member", self._metadata,
     Column("id", Integer, primary_key=True),
     Column("name", String(255)),
     mysql_engine='InnoDB',
     mysql_charset='utf8')
 
     return mapper(Member, members,
                                 polymorphic_on=members.c.type,
                                 polymorphic_identity="member",
                                 alocs": relationship(Aloc, 
backref="member", cascade="all,delete- orphan"),
                               })

  def __init__(self, connection_string, connection_pool_size, 
disable_overflow=True):
      if DataProvider._engine is None:
         if disable_overflow:
            DataProvider._engine = create_engine(connection_string, 
max_overflow=0, pool_size=connection_pool_size)
         else:
             DataProvider._engine = create_engine(connection_string, 
pool_size=connection_pool_size)
             DataProvider._SessionFactory.configure(bind=self._engine)

   self._map_project()
    self._map_member()
    aloc_mapper = self._map_aloc()
   self._map_aloc_auto(aloc_mapper)
   self._map_manager(aloc_mapper)


*def save_member(self, member):*
*  self._session.add(member)*
*  return member*


Of course, more fields and methods in all classes... 

The issue is, when adding a new Member, *member.alocs* get's filled with 
some objects.
It creates the record in DB but project_id is null.

I receive this debug message:
/usr/local/lib/python3.8/site-packages/sqlalchemy/orm/relationships.py:3441: 
SAWarning: relationship 'Aloc.project' will copy column project.id to 
column aloc.project_id, which conflicts with relationship(s): 
'Manager.manager
es' (copies project.id to aloc.project_id). If this is not the intention, 
consider if these relationships should be linked with back_populates, or if 
viewonly=True should be applied to one or more if they are read-only. For 
the le
ss common case that foreign key constraints are partially overlapping, the 
orm.foreign() annotation can be used to isolate the columns that should be 
written towards.   The 'overlaps' parameter may be used to remove this 
warning. (Backg
round on this error at: http://sqlalche.me/e/14/qzyx) 
 util.warn( 
/usr/local/lib/python3.8/site-packages/sqlalchemy/orm/relationships.py:3441: 
SAWarning: relationship 'Project.aloc' will copy column project.id to 
column aloc.project_id, which conflicts with relationship(s): 
'Project.managers' (copies project.id to aloc.project_id). If this is not 
the intention, consider if these relationships should be linked with 
back_populates, or if viewonly=True should be applied to one or more if 
they are read-only. For the l
ess common case that foreign key constraints are partially overlapping, the 
orm.foreign() annotation can be used to isolate the columns that should be 
written towards.   The 'overlaps' parameter may be used to remove this 
warning. (Back
ground on this error at: http://sqlalche.me/e/14/qzyx)

Please consider that I might mistaken myself in project_id. Might be 
id_project and typos like those.

Please. any idea?

kind regards,
Emanuel

-- 
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 view this discussion on the web visit 
https://groups.google.com/d/msgid/sqlalchemy/ded1ffbe-0244-41fc-aa19-9d46630285a5n%40googlegroups.com.

Reply via email to