Il 07/08/11 00.35, Aviv Giladi ha scritto:
Everything works great when I create and assign all 3 subratings to
the rating object before I add it to the session.
However, I need to be able to create a Rating that only has 1 or 2
subratings, and the other subratings absent.
When I do that, SQLAlchemy tells me:
InterfaceError: (InterfaceError) Error binding parameter 0 - probably
unsupported type. u'SELECT SubRating2.id AS subrating2_id \nFROM
subratings2 \nWHERE subrating2.id = ?' (<symbol 'NEVER_SET>,)

The above error is when I set Ratings's subrating1 and subrating3, but
not subrating2.
How do I avoid this error?


I think the error is somewhere else in your application code.
The model works as you can check in the attached test.

Regards,
Stefano.


--
Ing. Stefano Fontanelli
Asidev S.r.l.
Via Osteria Bianca, 108/A 50053 Empoli (Firenze)
Tel. (+39) 333 36 53 294   Fax. (+39) 0571 1 979 978
E-mail: s.fontane...@asidev.com   Web: www.asidev.com
Skype: stefanofontanelli

--
You received this message because you are subscribed to the Google Groups 
"sqlalchemy" group.
To post to this group, send email to sqlalchemy@googlegroups.com.
To unsubscribe from this group, send email to 
sqlalchemy+unsubscr...@googlegroups.com.
For more options, visit this group at 
http://groups.google.com/group/sqlalchemy?hl=en.

from sqlalchemy import *
from sqlalchemy.orm import backref
from sqlalchemy.orm import relationship
from sqlalchemy.ext.declarative import declarative_base


Base = declarative_base()

class SubRating1(Base):
    __tablename__ = 'subratings1'
    id = Column(Integer, primary_key=True)
    name = Column(Unicode(32), unique=True)


class SubRating2(Base):
    __tablename__ = 'subratings2'
    id = Column(Integer, primary_key=True)
    name = Column(Unicode(32), unique=True)


class SubRating3(Base):
    __tablename__ = 'subratings3'
    id = Column(Integer, primary_key=True)
    name = Column(Unicode(32), unique=True)


class Rating(Base):
    __tablename__ = 'ratings'
    id = Column(Integer, primary_key=True)
    name = Column(Unicode(32), unique=True)

    subrating1_id = Column(Integer, ForeignKey('subratings1.id'))
    subrating1 = relationship("SubRating1",
                              backref=backref("rating", 
                                              cascade="all, delete-orphan",
                                              uselist=False))

    subrating2_id = Column(Integer, ForeignKey('subratings2.id'))
    subrating2 = relationship("SubRating2",
                              backref=backref("rating", 
                                              cascade="all, delete-orphan",
                                              uselist=False))

    subrating3_id = Column(Integer, ForeignKey('subratings3.id'))
    subrating3 = relationship("SubRating3", 
                              backref=backref("rating",
                                              cascade="all, delete-orphan",
                                              uselist=False))


if __name__ == '__main__':

    from sqlalchemy import create_engine
    from sqlalchemy.orm import scoped_session
    from sqlalchemy.orm import sessionmaker

    engine = create_engine('sqlite:///', echo=True)
    Base.metadata.create_all(engine)
    session = scoped_session(sessionmaker())
    session.configure(bind=engine)

    rating = Rating(name=u'My First Rating')
    session.add(rating)
    session.flush()

    assert rating.subrating1 == None
    assert rating.subrating2 == None
    assert rating.subrating3 == None

    session.commit()

    subrating1 = SubRating1(name=u'My First SubRating1')
    rating.subrating1 = subrating1

    assert rating.subrating1 == subrating1
    assert rating.subrating2 == None
    assert rating.subrating3 == None
    assert subrating1.rating == rating

    session.flush()
    session.commit()

    subrating3 = SubRating3(name=u'My First SubRating3')
    rating.subrating3 = subrating3

    assert rating.subrating1 == subrating1
    assert subrating1.rating == rating
    assert rating.subrating2 == None
    assert rating.subrating3 == subrating3
    assert subrating3.rating == rating

    session.flush()
    session.commit()



"""
$ python test.py 
2011-08-07 15:48:54,697 INFO sqlalchemy.engine.base.Engine PRAGMA table_info("subratings3")
2011-08-07 15:48:54,697 INFO sqlalchemy.engine.base.Engine ()
2011-08-07 15:48:54,698 INFO sqlalchemy.engine.base.Engine PRAGMA table_info("subratings2")
2011-08-07 15:48:54,698 INFO sqlalchemy.engine.base.Engine ()
2011-08-07 15:48:54,698 INFO sqlalchemy.engine.base.Engine PRAGMA table_info("subratings1")
2011-08-07 15:48:54,698 INFO sqlalchemy.engine.base.Engine ()
2011-08-07 15:48:54,698 INFO sqlalchemy.engine.base.Engine PRAGMA table_info("ratings")
2011-08-07 15:48:54,698 INFO sqlalchemy.engine.base.Engine ()
2011-08-07 15:48:54,699 INFO sqlalchemy.engine.base.Engine 
CREATE TABLE subratings3 (
	id INTEGER NOT NULL, 
	name VARCHAR(32), 
	PRIMARY KEY (id), 
	UNIQUE (name)
)


2011-08-07 15:48:54,699 INFO sqlalchemy.engine.base.Engine ()
2011-08-07 15:48:54,699 INFO sqlalchemy.engine.base.Engine COMMIT
2011-08-07 15:48:54,700 INFO sqlalchemy.engine.base.Engine 
CREATE TABLE subratings2 (
	id INTEGER NOT NULL, 
	name VARCHAR(32), 
	PRIMARY KEY (id), 
	UNIQUE (name)
)


2011-08-07 15:48:54,700 INFO sqlalchemy.engine.base.Engine ()
2011-08-07 15:48:54,700 INFO sqlalchemy.engine.base.Engine COMMIT
2011-08-07 15:48:54,700 INFO sqlalchemy.engine.base.Engine 
CREATE TABLE subratings1 (
	id INTEGER NOT NULL, 
	name VARCHAR(32), 
	PRIMARY KEY (id), 
	UNIQUE (name)
)


2011-08-07 15:48:54,700 INFO sqlalchemy.engine.base.Engine ()
2011-08-07 15:48:54,701 INFO sqlalchemy.engine.base.Engine COMMIT
2011-08-07 15:48:54,701 INFO sqlalchemy.engine.base.Engine 
CREATE TABLE ratings (
	id INTEGER NOT NULL, 
	name VARCHAR(32), 
	subrating1_id INTEGER, 
	subrating2_id INTEGER, 
	subrating3_id INTEGER, 
	PRIMARY KEY (id), 
	UNIQUE (name), 
	FOREIGN KEY(subrating1_id) REFERENCES subratings1 (id), 
	FOREIGN KEY(subrating2_id) REFERENCES subratings2 (id), 
	FOREIGN KEY(subrating3_id) REFERENCES subratings3 (id)
)


2011-08-07 15:48:54,701 INFO sqlalchemy.engine.base.Engine ()
2011-08-07 15:48:54,701 INFO sqlalchemy.engine.base.Engine COMMIT
2011-08-07 15:48:54,713 INFO sqlalchemy.engine.base.Engine BEGIN (implicit)
2011-08-07 15:48:54,716 INFO sqlalchemy.engine.base.Engine INSERT INTO ratings (name, subrating1_id, subrating2_id, subrating3_id) VALUES (?, ?, ?, ?)
2011-08-07 15:48:54,716 INFO sqlalchemy.engine.base.Engine (u'My First Rating', None, None, None)
2011-08-07 15:48:54,717 INFO sqlalchemy.engine.base.Engine COMMIT
2011-08-07 15:48:54,718 INFO sqlalchemy.engine.base.Engine BEGIN (implicit)
2011-08-07 15:48:54,719 INFO sqlalchemy.engine.base.Engine SELECT ratings.id AS ratings_id, ratings.name AS ratings_name, ratings.subrating1_id AS ratings_subrating1_id, ratings.subrating2_id AS ratings_subrating2_id, ratings.subrating3_id AS ratings_subrating3_id 
FROM ratings 
WHERE ratings.id = ?
2011-08-07 15:48:54,719 INFO sqlalchemy.engine.base.Engine (1,)
2011-08-07 15:48:54,721 INFO sqlalchemy.engine.base.Engine INSERT INTO subratings1 (name) VALUES (?)
2011-08-07 15:48:54,721 INFO sqlalchemy.engine.base.Engine (u'My First SubRating1',)
2011-08-07 15:48:54,722 INFO sqlalchemy.engine.base.Engine UPDATE ratings SET subrating1_id=? WHERE ratings.id = ?
2011-08-07 15:48:54,722 INFO sqlalchemy.engine.base.Engine (1, 1)
2011-08-07 15:48:54,730 INFO sqlalchemy.engine.base.Engine COMMIT
2011-08-07 15:48:54,731 INFO sqlalchemy.engine.base.Engine BEGIN (implicit)
2011-08-07 15:48:54,731 INFO sqlalchemy.engine.base.Engine SELECT ratings.id AS ratings_id, ratings.name AS ratings_name, ratings.subrating1_id AS ratings_subrating1_id, ratings.subrating2_id AS ratings_subrating2_id, ratings.subrating3_id AS ratings_subrating3_id 
FROM ratings 
WHERE ratings.id = ?
2011-08-07 15:48:54,731 INFO sqlalchemy.engine.base.Engine (1,)
2011-08-07 15:48:54,732 INFO sqlalchemy.engine.base.Engine SELECT subratings1.id AS subratings1_id, subratings1.name AS subratings1_name 
FROM subratings1 
WHERE subratings1.id = ?
2011-08-07 15:48:54,732 INFO sqlalchemy.engine.base.Engine (1,)
2011-08-07 15:48:54,734 INFO sqlalchemy.engine.base.Engine INSERT INTO subratings3 (name) VALUES (?)
2011-08-07 15:48:54,734 INFO sqlalchemy.engine.base.Engine (u'My First SubRating3',)
2011-08-07 15:48:54,735 INFO sqlalchemy.engine.base.Engine UPDATE ratings SET subrating3_id=? WHERE ratings.id = ?
2011-08-07 15:48:54,735 INFO sqlalchemy.engine.base.Engine (1, 1)
2011-08-07 15:48:54,736 INFO sqlalchemy.engine.base.Engine SELECT ratings.id AS ratings_id, ratings.name AS ratings_name, ratings.subrating1_id AS ratings_subrating1_id, ratings.subrating2_id AS ratings_subrating2_id, ratings.subrating3_id AS ratings_subrating3_id 
FROM ratings 
WHERE ? = ratings.subrating1_id
2011-08-07 15:48:54,736 INFO sqlalchemy.engine.base.Engine (1,)
2011-08-07 15:48:54,737 INFO sqlalchemy.engine.base.Engine COMMIT

"""

Reply via email to