Hello everyone,
I'm having a silly problem on eagerload, when I do:
users = session.query(User).options(eagerload('usercity')).all()
or
users = session.query(User).options(eagerload(User.usercity)).all()
Exception:
sqlalchemy.exc.ProgrammingError: (ProgrammingError) invalid reference to
FROM-clause entry for table "city"
LINE 2: ...city AS city_1 ON city_1.id = user_.city_id ORDER BY city.id
^
HINT: Perhaps you meant to reference the table alias "city_1".
'SELECT user_.id AS user__id, user_.name AS user__name, user_.city_id
AS user__city_id, city_1.id AS city_1_id, city_1.name AS city_1_name
\nFROM user_ LEFT OUTER JOIN city AS city_1 ON city_1.id = user_.city_id
ORDER BY city.id' {}
When I do:
users = session.query(User).all()
..it's all right.
Complete code:
import sqlalchemy
import warnings
import random
from sqlalchemy import create_engine, Table, Column, Integer, Unicode,
MetaData, ForeignKey
from sqlalchemy.orm import sessionmaker, mapper, relation, eagerload
from sqlalchemy.exceptions import SAWarning
warnings.simplefilter('error', SAWarning)
engine = create_engine("postgres://postgres:qwe123...@localhost/ts",
convert_unicode=True, assert_unicode=True)
metadata = MetaData(bind=engine)
user_table = sqlalchemy.Table('user_', metadata,
Column('id', Integer, primary_key=True),
Column('name', Unicode(30)),
Column('city_id', Integer, ForeignKey('city.id'))
)
city_table = Table('city', metadata,
Column('id', Integer, primary_key=True),
Column('name', Unicode(30))
)
class User(object):
def __init__(self, name):
self.name = name
class City(object):
def __init__(self, name):
self.name = name
mapper(User, user_table, properties={'usercity':relation(City,
order_by='city.id', backref='user_backref')})
mapper(City, city_table, properties={'users':relation(User,
order_by='user_.id', backref='city_backref')})
Sesm = sessionmaker(bind=engine)
session = Sesm()
def add_some():
metadata.create_all()
with open(r'c:\bin\diceware.wordlist.asc') as f:
for i in range(1,10):
for i in range(random.randint(1,500)):
x = f.readline()
u = User(unicode(f.readline().split()[1]))
for i in range(random.randint(1,500)):
x = f.readline()
c = City(unicode(f.readline().split()[1]))
u.city = c
session.add(u)
session.add(c)
session.commit()
def del_all():
users = session.query(User).all()
for u in users:
session.delete(u)
session.commit()
cities = session.query(City).all()
for c in cities:
session.delete(c)
session.commit()
if __name__ == '__main__':
del_all()
add_some()
## users = session.query(User).all()
users = session.query(User).options(eagerload(User.usercity)).all()
for u in users:
print 'name', u.name, 'city', u.usercity.name
Complete exception:
Traceback (most recent call last):
File "<string>", line 244, in run_nodebug
File "C:\Documents and Settings\Administrator\Desktop\ts.py", line
76, in <module>
users = session.query(User).options(eagerload(User.usercity)).all()
File
"C:\Python26\lib\site-packages\sqlalchemy-0.5.8-py2.6.egg\sqlalchemy\orm\query.py",
line 1267, in all
return list(self)
File
"C:\Python26\lib\site-packages\sqlalchemy-0.5.8-py2.6.egg\sqlalchemy\orm\query.py",
line 1361, in __iter__
return self._execute_and_instances(context)
File
"C:\Python26\lib\site-packages\sqlalchemy-0.5.8-py2.6.egg\sqlalchemy\orm\query.py",
line 1364, in _execute_and_instances
result = self.session.execute(querycontext.statement,
params=self._params, mapper=self._mapper_zero_or_none())
File
"C:\Python26\lib\site-packages\sqlalchemy-0.5.8-py2.6.egg\sqlalchemy\orm\session.py",
line 753, in execute
clause, params or {})
File
"C:\Python26\lib\site-packages\sqlalchemy-0.5.8-py2.6.egg\sqlalchemy\engine\base.py",
line 824, in execute
return Connection.executors[c](self, object, multiparams, params)
File
"C:\Python26\lib\site-packages\sqlalchemy-0.5.8-py2.6.egg\sqlalchemy\engine\base.py",
line 874, in _execute_clauseelement
return self.__execute_context(context)
File
"C:\Python26\lib\site-packages\sqlalchemy-0.5.8-py2.6.egg\sqlalchemy\engine\base.py",
line 896, in __execute_context
self._cursor_execute(context.cursor, context.statement,
context.parameters[0], context=context)
File
"C:\Python26\lib\site-packages\sqlalchemy-0.5.8-py2.6.egg\sqlalchemy\engine\base.py",
line 950, in _cursor_execute
self._handle_dbapi_exception(e, statement, parameters, cursor, context)
File
"C:\Python26\lib\site-packages\sqlalchemy-0.5.8-py2.6.egg\sqlalchemy\engine\base.py",
line 931, in _handle_dbapi_exception
raise exc.DBAPIError.instance(statement, parameters, e,
connection_invalidated=is_disconnect)
sqlalchemy.exc.ProgrammingError: (ProgrammingError) invalid reference to
FROM-clause entry for table "city"
LINE 2: ...city AS city_1 ON city_1.id = user_.city_id ORDER BY city.id
^
HINT: Perhaps you meant to reference the table alias "city_1".
'SELECT user_.id AS user__id, user_.name AS user__name, user_.city_id
AS user__city_id, city_1.id AS city_1_id, city_1.name AS city_1_name
\nFROM user_ LEFT OUTER JOIN city AS city_1 ON city_1.id = user_.city_id
ORDER BY city.id' {}
>>>
--
You received this message because you are subscribed to the Google Groups
"sqlalchemy" group.
To post to this group, send email to sqlalch...@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.