that means min_version and max_version aren't columns. I guess you're looking for Version.version, in which case you probably need to JOIN to that table twice on both the "min_version" and "max_version". write (and test) the query you want in SQL first to get an idea for what you're doing.
sniipe wrote: > > After change (delete 'version' attribute): > > ProgrammingError: (ProgrammingError) (1064, "You have an error in your > SQL syntax; check the manual that corresponds to your MySQL server > version for the right syntax to use near 'AND' at line 3") u'SELECT > engines.id AS engines_id, engines.min_version_id AS > engines_min_version_id, engines.max_version_id AS > engines_max_version_id, engines.type_id AS engines_type_id \nFROM > engines LEFT OUTER JOIN versions ON engines.min_version_id = > versions.id \nWHERE %s BETWEEN AND ' ['7.0.1.4'] > > > > On 22 Maj, 21:40, "Michael Bayer" <[email protected]> wrote: >> Engine.min_version and max_version are instrumented column attributes. >> they don't have an attribute called "version". i think you want >> between(x, Engine.min_version, Engine.max_version). >> >> sniipe wrote: >> >> > Ok It's working but I can't use 'between': >> >> > engine = meta.Session.query(Engine).outerjoin((Version, >> > Engine.min_version_id==Version.id)).filter(between(request.POST >> > ['version'], Engine.min_version.version, >> > Engine.max_version.version)).all() >> >> > and I've got error: >> >> > AttributeError: Neither 'InstrumentedAttribute' object nor >> > 'Comparator' object has an attribute 'version' >> >> > What am I doing wrong? >> >> > On 22 Maj, 17:59, "Michael Bayer" <[email protected]> wrote: >> >> sniipe wrote: >> >> >> > Hi :) >> >> >> > I have three tables: >> >> >> > 1) >> >> > t_version = sa.Table("versions", meta.metadata, >> >> > sa.Column("id", sa.types.Integer(), primary_key=True, >> >> > autoincrement=True), >> >> > sa.Column("version", mysql.MSChar(length=100, >> >> > collation='utf8_polish_ci'), nullable=False, unique=True) >> >> > ) >> >> >> > class Version(object): >> >> > pass >> >> >> > orm.mapper(Version, t_version) >> >> >> > 2) >> >> > t_type = sa.Table("types", >> >> > meta.metadata, >> >> > sa.Column("id", sa.types.Integer(), primary_key=True, >> >> > autoincrement=True), >> >> > sa.Column("name", mysql.MSChar(length=100, >> >> > collation='utf8_polish_ci'), nullable=False, unique=True), >> >> > ) >> >> >> > class Type(object): >> >> > pass >> >> >> > orm.mapper(Type, t_type, properties = { >> >> > 'engine' : orm.relation(Engine, uselist=False, >> >> > backref='Type_Engine') >> >> > }) >> >> >> > 3) >> >> > t_engine = sa.Table("engines", meta.metadata, >> >> > sa.Column("id", sa.types.Integer(), primary_key=True, >> >> > autoincrement=True), >> >> > sa.Column("min_version_id", sa.types.Integer(), sa.ForeignKey >> >> > ("versions.id"), nullable=False), >> >> > sa.Column("max_version_id", sa.types.Integer(), sa.ForeignKey >> >> > ("versions.id"), nullable=False), >> >> > sa.Column("type_id", sa.types.Integer(), sa.ForeignKey >> >> > ("types.id"), nullable=False), >> >> > ) >> >> >> > class Engine(object): >> >> > pass >> >> >> > orm.mapper(Engine, t_engine, properties = { >> >> > 'type' : orm.relation(Type, uselist=False, >> backref='Engine_Type'), >> >> > 'min_version' : orm.relation(Version, >> >> > primaryjoin=t_engine.c.min_version_id==t_version.c.id), >> >> > 'max_version' : orm.relation(Version, >> >> > primaryjoin=t_engine.c.max_version_id==t_version.c.id) >> >> > }) >> >> >> > My problem is how to make query equal this SQL instruction "select >> >> > e.id, e.type_id, tv.version as min_version, tv2.version as >> max_version >> >> > from engines e join versions tv on(e.min_version_id=tv.id) join >> >> > versions tv2 on(e.max_version_id=tv2.id) where '7.0.1.32' between >> >> > tv.version and tv2.version;" >> >> >> > I've tried to do something like that: >> >> >> > engine = >> meta.Session.query(Engine).outerjoin(Version).filter(between >> >> > (request.POST['version'], Engine.min_version.version, >> >> > Engine.max_version.version)).all() >> >> >> when you do the outerjoin, pass it the relation you're joining on or >> an >> >> onclause, such as >> >> >> query.outerjoin(Version.engine) >> >> >> or >> >> >> query.outerjoin((Version, Engine.some_col==Version.some_other_col)) > > > --~--~---------~--~----~------------~-------~--~----~ You received this message because you are subscribed to the Google Groups "sqlalchemy" group. To post to this group, send email to [email protected] To unsubscribe from this group, send email to [email protected] For more options, visit this group at http://groups.google.com/group/sqlalchemy?hl=en -~----------~----~----~----~------~----~------~--~---
