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
"""