Hello

I would like to change a value in a one-to-one relationship but I cannot 
because of some actions that SQLAlchemy try to do, and I don't know why.
Here is my simplified code :

# -*- coding: utf-8 -*-
from sqlalchemy import *
from sqlalchemy.orm import *
from sqlalchemy.ext.declarative import declarative_base

Base = declarative_base()

_taxon_table = Table('taxon', Base.metadata,
        Column('id', Integer, primary_key=True),
        schema='botany'
    )

_foliagetype_table = Table('foliagetype', Base.metadata,
        Column('id', Integer, primary_key=True),
        schema='botany'
    )

_plant_table = Table('plant', Base.metadata,
        Column('id', Integer, primary_key=True),
        Column('taxon_id', Integer),
        Column('foliagetype_id', Integer),
        ForeignKeyConstraint(['taxon_id'], ['botany.taxon.id']),
        ForeignKeyConstraint(['foliagetype_id'], ['botany.foliagetype.id']),
        schema='botany'
    )

class Taxon(Base):
    __table__ = _taxon_table

class Foliagetype(Base):
    __table__ = _foliagetype_table

class Plant(Base):
    __table__ = _plant_table

    taxon = relationship('Taxon',
                backref=backref('plant',
                    uselist=False))

    foliagetype = relationship('Foliagetype',
                backref=backref('plants'))

if __name__ == '__main__':

    engine = create_engine('postgresql://xxx@localhost:5432/xxx')
    Session = sessionmaker(bind=engine)
    session = Session()

    taxon_old = session.query(Taxon).get(-2147483634)
    taxon_new = session.query(Taxon).get(-2147483645)

    foliagetype_old = session.query(Foliagetype).get(-2147483646)
    foliagetype_new = session.query(Foliagetype).get(-2147483645)

    plant = session.query(Plant).get(-2147483643)

    print "-- Change foliagetype --"
    print plant.foliagetype is foliagetype_old  # True
    plant.foliagetype = foliagetype_new
    print plant.foliagetype is foliagetype_new  # True

    print "-- Change taxon --"
    print plant.taxon is taxon_old  # True
    plant.taxon = taxon_new  # triggers an IntegrityError
    print plant.taxon is taxon_new



So a plant must have one and exactly one foliagetype and same with the the 
taxon : a plant must have one and exactly one taxon. The difference 
however, is that a foliagetype can be linked to several plants while a 
taxon can only be linked to a single plant.

In my code above the change of foliagetype leads SQLAlchemy to output the 
expected SQL :

UPDATE botany.plant SET foliagetype_id= -2147483645 WHERE botany.plant.id = 
 -2147483643


However, concerning the change of taxon, I don't understand what SQLAlchemy 
is doing. It first output:

SELECT botany.plant.id AS botany_plant_id, botany.plant.taxon_id AS 
botany_plant_taxon_id, botany.plant.foliagetype_id AS 
botany_plant_foliagetype_id 
FROM botany.plant 
WHERE  -2147483634 = botany.plant.taxon_id


and then:

UPDATE botany.plant SET taxon_id=NULL WHERE botany.plant.id =  -2147483643


which fails because NULL is not allowed for taxon_id. So, why do not 
SQLAlchemy just output this instead?

UPDATE botany.plant SET taxon_id= -2147483645 WHERE botany.plant.id = 
 -2147483643


-- 
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 http://groups.google.com/group/sqlalchemy?hl=en.
For more options, visit https://groups.google.com/groups/opt_out.


Reply via email to