bind params confused when mapping to select with IN

Issue #853 resolved
Mike Bayer repo owner created an issue
rom sqlalchemy import *
from sqlalchemy.orm import *

metadata = MetaData("...")
metadata.bind.echo=True

table = Table("test", metadata,
             Column("id", Integer, primary_key=True),
             Column("data", String))

table.create()

table.insert().execute([1}, {"data": 2}, {"data": 3},
                       {"data": 4}, {"data": 5}, {"data": 6},
                       {"data": 7}, {"data": 8}, {"data": 9},
                       {"data": 10}, {"data": 11}, {"data": 12},
                       {"data": 13}, {"data": 14}, {"data": 15},
                       {"data": 30}, {"data": 44}, {"data": 55}]({"data":))

test = table.select(table.c.id.in_([3, 4, 5, 8, 10, 11, 13, 30, 44,
45](2,))).alias("testView")

class Test(object):
   pass

mapper(Test, test)

referer = Table("referer", metadata,
               Column("id", Integer, primary_key=True),
               Column("fk", Integer, ForeignKey("test.id")))

referer.create()

referer.insert().execute([2}]({"fk":))

class Referer(object):
   pass

mapper(Referer, referer, properties={"ref": relation(Test)})

session = create_session()

t = session.query(Test).get(2)
print t
r = session.query(Referer).get(1)
print r.fk, r.ref


It prints

None
2 None

and the SQL statement for the first get should have param_1=1 instead
of None.

2007-11-06 16:26:30,394 INFO sqlalchemy.engine.base.Engine.0x..34
SELECT "testView".id AS "testView_id", "testView".data AS
"testView_data"
FROM (SELECT test.id AS id, test.data AS data
FROM test
WHERE test.id IN (%(test_id)s, %(test_id_1)s, %(test_id_2)s, %
(test_id_3)s, %(test_id_4)s, %(test_id_5)s, %(test_id_6)s, %
(test_id_7)s, %(test_id_8)s, %(test_id_9)s, %(test_id_10)s)) AS
"testView"
WHERE "testView".id = %(param_1)s ORDER BY "testView".id
2007-11-06 16:26:30,394 INFO sqlalchemy.engine.base.Engine.0x..34
{'test_id_3': 5, 'test_id_10': 45, 'param_1': None, 'test_id_8': 30,
'test_id_9': 44, 'test_id_1': 3, 'test_id_2': 4, 'test_id': 2,
'test_id_4': 8, 'test_id_5': 10, 'test_id_6': 11, 'test_id_7': 13}

Comments (6)

  1. Mike Bayer reporter

    cant reproduce. output with PG on both 0.4.0 and 0.4 trunk is:

    SELECT "testView".id AS "testView_id", "testView".data AS "testView_data" 
    FROM (SELECT test.id AS id, test.data AS data 
    FROM test 
    WHERE test.id IN (%(test_id)s, %(test_id_1)s, %(test_id_2)s, %(test_id_3)s, %(test_id_4)s, %(test_id_5)s, %(test_id_6)s, %(test_id_7)s, %(test_id_8)s, %(test_id_9)s, %(test_id_10)s)) AS "testView" 
    WHERE "testView".id = %(param_1)s ORDER BY "testView".id
    2007-11-06 18:57:05,087 INFO sqlalchemy.engine.base.Engine.0x..b0 {'test_id_3': 5, 'test_id_10': 45, 'param_1': 2, 'test_id_8': 30, 'test_id_9': 44, 'test_id_1': 3, 'test_id_2': 4, 'test_id': 2, 'test_id_4': 8, 'test_id_5': 10, 'test_id_6': 11, 'test_id_7': 13}
    <__main__.Test object at 0xc4e610>
    2007-11-06 18:57:05,090 INFO sqlalchemy.engine.base.Engine.0x..b0 SELECT referer.id AS referer_id, referer.fk AS referer_fk 
    FROM referer 
    WHERE referer.id = %(param_1)s ORDER BY referer.id
    2007-11-06 18:57:05,090 INFO sqlalchemy.engine.base.Engine.0x..b0 {'param_1': 1}
    2 <__main__.Test object at 0xc4e610>
    
  2. Log in to comment