I think I see why the warning pops up, thank you for clarifying that.

I'd prefer to live with the warning since in my actual application that 
contradiction won't be cropping up. What's the best way to suppress this 
particular warning?

On Tuesday, June 30, 2015 at 3:54:51 PM UTC-4, Viktor Roytman wrote:
>
> I have a three classes that I am using to represent a tree:
> Tree has some information about the tree at large and a list of nodes.
> Node has some information specific to a node, a list of subtrees, and 
> needs a particular piece of information about the Tree for a constraint.
> SubTree has a list of nodes.
>
> Here is some (working) example code for this setup:
>
> from sqlalchemy import (
>     Column, Integer, UniqueConstraint, ForeignKeyConstraint,
>     create_engine
> )
> from sqlalchemy.ext.declarative import declarative_base
> from sqlalchemy.orm import sessionmaker, relationship
>
>
> Base = declarative_base()
>
>
> class Tree(Base):
>     __tablename__ = 'tree'
>     id = Column(Integer, primary_key=True)
>     important_value = Column(Integer, nullable=False)
>     nodes = relationship('Node')
>
>
> class SubTree(Base):
>     __tablename__ = 'sub_tree'
>     id = Column(Integer, primary_key=True)
>     parent_node_id = Column(Integer, nullable=False)
>     important_value = Column(Integer, nullable=False)
>     nodes = relationship(
>         'Node',
>         foreign_keys='[Node.parent_sub_tree_id, Node.important_value]',
>     )
>     __table_args__ = (
>         UniqueConstraint('id', 'important_value'),
>         ForeignKeyConstraint(
>             ['parent_node_id', 'important_value'],
>             ['node.id', 'node.important_value']
>         ),
>     )
>
>
> class Node(Base):
>     __tablename__ = 'node'
>     id = Column(Integer, primary_key=True)
>     parent_tree_id = Column(Integer)
>     important_value = Column(Integer, nullable=False)
>     parent_sub_tree_id = Column(Integer)
>     sub_trees = relationship(
>         'SubTree',
>         foreign_keys=(
>             '[SubTree.parent_node_id, SubTree.important_value]'
>         ),
>     )
>     __table_args__ = (
>         UniqueConstraint('id', 'important_value'),
>         ForeignKeyConstraint(
>             ['parent_tree_id', 'important_value'],
>             ['tree.id', 'tree.important_value']
>         ),
>         ForeignKeyConstraint(
>             ['parent_sub_tree_id', 'important_value'],
>             ['sub_tree.id', 'sub_tree.important_value']
>         ),
>     )
>
>
> engine = create_engine('...')
> Base.metadata.create_all(engine)
>
> session = sessionmaker(bind=engine, autocommit=True)()
> with session.begin():
>     session.add(
>         Tree(
>             important_value=3,
>             nodes=[
>                 Node(
>                     sub_trees=[
>                         SubTree(
>                             nodes=[
>                                 Node(),
>                             ],
>                         ),
>                     ],
>                 ),
>             ],
>         )
>     )
>
> When I run this example, I get this warning:
>
> /.../lib/python3.4/site-packages/sqlalchemy/orm/relationships.py:2667: 
> SAWarning: relationship 'Tree.nodes' will copy column tree.important_value 
> to column node.important_value, which conflicts with relationship(s): 
> 'SubTree.nodes' (copies sub_tree.important_value to node.important_value). 
> Consider applying viewonly=True to read-only relationships, or provide a 
> primaryjoin condition marking writable columns with the foreign() 
> annotation.
>   for (pr, fr_) in other_props)
>
> I can't figure out how to modify the relationships to make SQLAlchemy 
> happy with my (admittedly convoluted) scheme.
>
> Any ideas?
>

-- 
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 [email protected].
To post to this group, send email to [email protected].
Visit this group at http://groups.google.com/group/sqlalchemy.
For more options, visit https://groups.google.com/d/optout.

Reply via email to