OperationalError «невозможно открыть файл базы данных», обрабатывающий результаты запроса с помощью SQLAlchemy и SQLite3 - PullRequest
6 голосов
/ 10 мая 2010

Я сталкиваюсь с этой маленькой проблемой, которая, я надеюсь, является просто глупой ошибкой пользователя. Это похоже на ограничение размера при запросе к базе данных SQLite. Мне удалось воспроизвести проблему с БД в памяти и простым сценарием, показанным ниже. Я могу заставить его работать, уменьшив количество записей в БД; или путем уменьшения размера каждой записи; или сбросив вызов order_by (). Я использую Python 2.5.5 и SQLAlchemy 0.6.0 в среде Cygwin.

Спасибо!

#!/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()

Сбой вызова 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' ()

Ответы [ 3 ]

2 голосов
/ 30 мая 2012

Проблема в том, что ваш скрипт Python не может найти файл SQLite . Установите правильный путь к файлу, и проблема будет решена.

2 голосов
/ 01 марта 2013

Я смог запустить ваш код, поэтому он работает. Тем не менее, я обнаружил, что ядро ​​SQLAlchemy лучше подходит для ситуаций, зависящих от производительности, таких как эта, есть некоторые издержки при использовании ORM. Я также специально вызываю классы SQLAlchemy, чтобы избежать загрузки всей библиотеки SQLAlchemy.

Следующее должно быть более упорядоченным, мы надеемся избежать проблем с памятью, если они у вас есть:

from sqlalchemy import create_engine, Table, Column, Integer, String, MetaData, select

engine = create_engine('sqlite:///:memory:', echo=False)
metadata = MetaData()
person_table = Table('person', metadata,
    Column('id', Integer, primary_key=True),
    Column('name', String))
metadata.create_all(engine)

session = engine.connect()

for i in range(5000):
    session.execute(person_table.insert().values(name='012345678901234567890123456789012'))
persons = select([person_table.c.name])
persons = persons.order_by(person_table.c.name.asc())
result = session.execute(persons)
session.close()

count = 0
for i in result: count += 1
print "count =", count
1 голос
/ 10 мая 2010

Меняется ли на:

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

работа? Если нет, я подозреваю, что order_by в константном поле дует какая-то внутренняя таблица. Вы также можете найти

engine = sqlalchemy.create_engine('sqlite:///:memory:', echo=True)

полезно для отладки. Не похоже, что 5000 простых строк должны вызывать проблемы. Конечно, на моем Linux 2.6.32 с SQLAlchemy 0.6.0 он работает без проблем для: memory: или реального файла ... извините.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...