[Sqlalchemy-tickets] Issue #4363: select from clause change when I update version from 1.2.12 to 1.
Brought to you by:
zzzeek
From: 大易归真 <iss...@bi...> - 2018-11-12 10:14:01
|
New issue 4363: select from clause change when I update version from 1.2.12 to 1.2.13 https://bitbucket.org/zzzeek/sqlalchemy/issues/4363/select-from-clause-change-when-i-update 大易归真: My query code is: ``` funcs = aliased(Function) mapping = db.session.query(FunctionMapping).get(1) foreign_funcs = mapping.peers.join(ForeignFunction.functions).join(funcs) ``` When use version 1.2.12: The SQL is ``` SELECT ... FROM foreign_function_set, foreign_function INNER JOIN foreign_function_map AS foreign_function_map_1 ON foreign_function.id = foreign_function_map_1.foreign_function_id INNER JOIN function ON function.id = foreign_function_map_1.function_id INNER JOIN function AS function_2 ON function.id = function_2.parent_id AND function_2.id = function.parent_id LEFT OUTER JOIN (foreign_function_map AS foreign_function_map_2 INNER JOIN function AS function_1 ON function_1.id = foreign_function_map_2.function_id) ON foreign_function.id = foreign_function_map_2.foreign_function_id ``` When I update sqlalchemy version to 1.2.13, The SQL is: ``` SELECT ... FROM foreign_function_set INNER JOIN `function` AS function_2 ON function_2.id = `function`.id OR function_2.function_id = `function`.id OR function_2.function_group_id = `function`.id, foreign_function INNER JOIN foreign_function_map AS foreign_function_map_1 ON foreign_function.id = foreign_function_map_1.foreign_function_id INNER JOIN `function` ON `function`.id = foreign_function_map_1.function_id LEFT OUTER JOIN (foreign_function_map AS foreign_function_map_2 INNER JOIN `function` AS function_1 ON function_1.id = foreign_function_map_2.function_id) ON foreign_function.id = foreign_function_map_2.foreign_function_id ``` The program raise error `u"Unknown column 'function.id' in 'on clause'"` I find 1.2.13 add `_from_obj ` to query, but don't understand how this attribute change SQL? This is class and secondary defina ``` #!python class Function(db.Model): id = db.Column(db.SmallInteger, autoincrement=True, primary_key=True) function_id = db.Column(db.SmallInteger) function_group_id = db.Column(db.SmallInteger) parent_id = db.Column(db.SmallInteger, db.ForeignKey('function.id')) children = db.relationship( 'Function', lazy='dynamic', backref=db.backref( 'parent', remote_side=[id])) foreign_function_map = db.Table('foreign_function_map', db.Column( 'foreign_function_id', db.SmallInteger, db.ForeignKey( 'foreign_function.id', ondelete='CASCADE'), primary_key=True ), db.Column( 'function_id', db.SmallInteger, db.ForeignKey('function.id'), primary_key=True )) class ForeignFunction(db.Model): id = db.Column(db.SmallInteger, autoincrement=True, primary_key=True) functions = db.relationship( 'Function', secondary=foreign_function_map, lazy='joined') foreign_function_set = db.Table('foreign_function_set', db.Column( 'function_mapping_id', db.SmallInteger, db.ForeignKey( 'function_mapping.id'), primary_key=True), db.Column( 'foreign_function_id', db.SmallInteger, db.ForeignKey( 'foreign_function.id'), primary_key=True)) class FunctionMapping(db.Model): id = db.Column(db.SmallInteger, autoincrement=True, primary_key=True) key = db.Column(db.String(20), index=True, unique=True) peers = db.relationship( 'ForeignFunction', secondary=foreign_function_set, lazy='dynamic', backref=db.backref('site')) ``` |