I'm probably overlooking something simple, looking for feedback before 
opening an issue.

I have some objects with relationships defined between. When I create a new 
related object and pass it in the append() method of the collection 
everything works as expected, the foreign key is set. When I assign the new 
related object to a variable and pass that to the append() method, the 
foreign key isn't set and I get a 'null value in column "directory_name" 
violates not-null constraint'. This is with SQLAlchemy 1.2.5 and python 3.6.

import sqlalchemy as sa
import sqlalchemy.orm as orm
from sqlalchemy.ext.declarative import declarative_base


Base = declarative_base()


class Directory(Base):
    name = sa.Column(sa.String, primary_key=True)

    __tablename__ = 'directory'


class Category(Base):
    name = sa.Column(sa.String, primary_key=True)

    __tablename__ = 'category'


class Filter(Base):
    directory_name = sa.Column(sa.String, sa.ForeignKey('directory.name'), 
primary_key=True)
    category_name  = sa.Column(sa.String, sa.ForeignKey('category.name'), 
primary_key=True)
    filter         = sa.Column(sa.String, primary_key=True)

    directory = orm.relationship('Directory', 
backref=orm.backref('filters', lazy='joined'), lazy='joined')
    category  = orm.relationship('Category', backref=orm.backref('filters', 
lazy='joined'), lazy='joined')

    __tablename__ = 'filter'


engine = 
sa.create_engine('postgresql+psycopg2://postgres@localhost/bug_test')
Base.metadata.create_all(engine)
session = orm.sessionmaker(bind=engine)()

directory = Directory(name='test')
category_a = Category(name='category a')
category_b = Category(name='category b')

session.add(directory)
session.add(category_a)
session.add(category_b)
session.commit()

assert len(session.new) == 0

# Instantiate object in call to append - works
directory.filters.append(Filter(filter='test filter', category=category_a))
session.commit()

assert len(session.new) == 0

# Instantiate object before call to append - fails
new_filter = Filter(filter='new filter', category=category_b)
directory.filters.append(new_filter)

session.commit()

assert len(session.new) == 0


Thanks,
Derek

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

Reply via email to