OperationalError"无法打开数据库文件"使用SQLAlchemy和SQLite3处理查询结果

Pet*_*ter 6 python sqlite sqlalchemy

我遇到了这个小问题,我希望这只是一个愚蠢的用户错误.对于SQLite数据库的查询,它看起来像某种大小限制.我设法使用内存数据库和下面显示的简单脚本重现该问题.我可以通过减少数据库中的记录数量来使其工作; 或通过减少每条记录的大小; 或者通过删除order_by()调用.我在Cygwin环境中使用Python 2.5.5和SQLAlchemy 0.6.0.

谢谢!

#!/usr/bin/python
from sqlalchemy.orm import sessionmaker
import sqlalchemy
import sqlalchemy.orm

class Person(object):
    def __init__(self, name): self.name = name

engine = sqlalchemy.create_engine('sqlite:///:memory:')
Session = sessionmaker(bind=engine)
metadata = sqlalchemy.schema.MetaData(bind=engine)
person_table = sqlalchemy.Table('person', metadata,
        sqlalchemy.Column('id', sqlalchemy.types.Integer, primary_key=True),
        sqlalchemy.Column('name', sqlalchemy.types.String))
metadata.create_all(engine)
sqlalchemy.orm.mapper(Person, person_table)

session = Session()
session.add_all([Person("012345678901234567890123456789012")
                 for i in range(5000)])
session.commit()

persons = session.query(Person).order_by(Person.name).all()
print "count =", len(persons)

session.close()
Run Code Online (Sandbox Code Playgroud)

对查询结果的all()调用失败,出现OperationalError异常:

Traceback (most recent call last):
  File "./stress.py", line 27, in <module>
    persons = session.query(Person).order_by(Person.name).all()
  File "/usr/lib/python2.5/site-packages/sqlalchemy/orm/query.py", line 1343, in all
    return list(self)
  File "/usr/lib/python2.5/site-packages/sqlalchemy/orm/query.py", line 1451, in __iter__
    return self._execute_and_instances(context)
  File "/usr/lib/python2.5/site-packages/sqlalchemy/orm/query.py", line 1456, in _execute_and_instances
    mapper=self._mapper_zero_or_none())
  File "/usr/lib/python2.5/site-packages/sqlalchemy/orm/session.py", line 737, in execute
    clause, params or {})
  File "/usr/lib/python2.5/site-packages/sqlalchemy/engine/base.py", line 1109, in execute
    return Connection.executors[c](self, object, multiparams, params)
  File "/usr/lib/python2.5/site-packages/sqlalchemy/engine/base.py", line 1186, in _execute_clauseelement
    return self.__execute_context(context)
  File "/usr/lib/python2.5/site-packages/sqlalchemy/engine/base.py", line 1215, in __execute_context
    context.parameters[0], context=context)
  File "/usr/lib/python2.5/site-packages/sqlalchemy/engine/base.py", line 1284, in _cursor_execute
    self._handle_dbapi_exception(e, statement, parameters, cursor, context)
  File "/usr/lib/python2.5/site-packages/sqlalchemy/engine/base.py", line 1282, in _cursor_execute
    self.dialect.do_execute(cursor, statement, parameters, context=context)
  File "/usr/lib/python2.5/site-packages/sqlalchemy/engine/default.py", line 277, in do_execute
    cursor.execute(statement, parameters)
sqlalchemy.exc.OperationalError: (OperationalError) unable to open database file u'SELECT person.id AS person_id, person.name AS person_name \nFROM person ORDER BY person.name' ()
Run Code Online (Sandbox Code Playgroud)

msw*_*msw 1

是否更改为:

persons = session.query(Person).order_by(Person.name).count()
print "count =", persons
Run Code Online (Sandbox Code Playgroud)

工作?如果没有,我怀疑常量字段上的 order_by 正在破坏某些内部表。您可能还会发现

engine = sqlalchemy.create_engine('sqlite:///:memory:', echo=True)
Run Code Online (Sandbox Code Playgroud)

对于调试很有用。5000 个简单的行似乎不会造成麻烦。当然,在我的带有 SQLAlchemy 0.6.0 的 Linux 2.6.32 上,它可以正常工作:内存:或真实文件...抱歉。