【问题标题】:SQLAlchemy: Unable to get the first item of querySQLAlchemy:无法获取查询的第一项
【发布时间】:2013-11-15 14:05:08
【问题描述】:

我目前正在学习 SQLAlchemy,我发现了这个奇怪的东西。我正在试验一个存储一个人的姓名和地址的表,为了得到他们我使用这个:

session.query(User)

为了得到第一个项目,我尝试了:

session.query(User).first()

这会抛出一个DatabaseError:

Traceback (most recent call last):
  File "<pyshell#4>", line 1, in <module>
    session.query(User).first()
  File "build\bdist.win32\egg\sqlalchemy\orm\query.py", line 2275, in first
    ret = list(self[0:1])
  File "build\bdist.win32\egg\sqlalchemy\orm\query.py", line 2142, in __getitem__
    return list(res)
  File "build\bdist.win32\egg\sqlalchemy\orm\query.py", line 2346, in __iter__
    return self._execute_and_instances(context)
  File "build\bdist.win32\egg\sqlalchemy\orm\query.py", line 2361, in _execute_and_instances
    result = conn.execute(querycontext.statement, self._params)
  File "build\bdist.win32\egg\sqlalchemy\engine\base.py", line 664, in execute
    return meth(self, multiparams, params)
  File "build\bdist.win32\egg\sqlalchemy\sql\elements.py", line 272, in _execute_on_connection
    return connection._execute_clauseelement(self, multiparams, params)
  File "build\bdist.win32\egg\sqlalchemy\engine\base.py", line 761, in _execute_clauseelement
    compiled_sql, distilled_params
  File "build\bdist.win32\egg\sqlalchemy\engine\base.py", line 874, in _execute_context
    context)
  File "build\bdist.win32\egg\sqlalchemy\engine\base.py", line 1023, in _handle_dbapi_exception
    exc_info
  File "build\bdist.win32\egg\sqlalchemy\util\compat.py", line 185, in raise_from_cause
    reraise(type(exception), exception, tb=exc_tb)
  File "build\bdist.win32\egg\sqlalchemy\engine\base.py", line 867, in _execute_context
    context)
  File "build\bdist.win32\egg\sqlalchemy\engine\default.py", line 376, in do_execute
    cursor.execute(statement, parameters)
DatabaseError: (DatabaseError) ORA-01036: illegal variable name/number
 'SELECT test_user_uid, test_user_name, test_user_address \nFROM (SELECT test_user."uid" AS test_user_uid, test_user.name AS test_user_name, test_user.address AS test_user_address \nFROM test_user) \nWHERE ROWNUM <= :ROWNUM_1' {'ROWNUM_1': 1}

但是,如果我选择所有行并遍历查询对象,我就能够检索到我想要的内容:

users = [user for user in session.query(User)]
user1 = users[0]

就是这样,我觉得这很奇怪。这是我的映射类:

class User(Base):
    __tablename__ = 'test_user'

    uid = Column(Integer, primary_key = True)
    name = Column(String(50))
    address = Column(String(100))

    def __repr__(self):
        return "<User (%s, %s)"%(self.name, self.address)

我最好的猜测是Session.query().first() 正在寻找第一行,以及生成的查询。但是,工作方法检索所有行,并在 Python 中选择第一行。问题显然来自生成的查询(无效查询)。主要问题是,是什么导致 SQLAlchemy 创建无效查询?

另外,我注意到 SQLAlchemy 通过使用子查询进行查询使事情变得更加困难。这种行为是故意的吗?

希望能得到满意的答复,谢谢!

【问题讨论】:

  • 不知道?出色地。 * 叹息 *.至少我会有风滚草徽章。
  • 奇怪的是它失败了。我的猜测是 Oracle 驱动程序与其他驱动程序相比有些特殊。只是一个想法:你试过session.query(User)[0]吗?
  • 是的,我有。结果是同样的错误。也许不兼容的版本?我使用最新的 sqlalchemy 和 oracle 10g。
  • 请查看Oracle: LIMIT/OFFSET Support 并尝试其中列出的选项:optimize_limits=True 或use_binds_for_limits=False。我对甲骨文一无所知,但我想第二个应该可以帮助你。祝你好运!

标签: python oracle sqlalchemy


【解决方案1】:

好吧,我很快就意识到了这一点。原来是版本问题,我之前用cx_Oracle版本5.0.2 10g,我尝试升级到版本5.1.2 10g,一切正常。

这可能是 SQLAlchemy 中一个未记录的错误,我找不到他们提到它的地方。

结论:如果您想在 Oracle 10g 中使用最新版本的 SQLAlchemy (0.9.0b1),则不应使用低于 5.1.2 10g 版本的 cx_Oracle。

希望这会有所帮助,感谢您阅读问题!

【讨论】:

    猜你喜欢
    • 2017-11-29
    • 2013-08-09
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-10-07
    相关资源
    最近更新 更多