таблица базы данных sqlalchemy заблокирована - PullRequest
5 голосов
/ 30 августа 2010

Я пытаюсь выбрать все записи из базы данных sqlite, имеющейся у меня с sqlalchemy, перебрать каждую из них и обновить ее. Я делаю это, потому что мне нужно переформатировать запись в моем столбце имени.

Вот код, который я использую для простого теста:

   def loadDb(name):    

        sqlite3.connect(name)    
        engine = create_engine('sqlite:///'+dbPath(), echo=False)      
        metadata = MetaData(bind=engine)

        return metadata

    db = database("dealers.db")
    metadata = db.loadDb()
    dealers = Table('dealers', metadata, autoload=True)

    dealer = dealers.select().order_by(asc(dealers.c.id)).execute()

    for d in dealer:
        u = dealers.update(dealers.c.id==d.id)
        u.execute(name="hi")

        break

Я получаю ошибку:

sqlalchemy.exc.OperationalError: (OperationalError) database table is locked u'UPDATE dealers SET name=? WHERE dealers.id = ?' ('hi', 1)

Я очень плохо знаком с sqlalchemy и не уверен, что означает эта ошибка или как ее исправить. Похоже, это должно быть очень простой задачей, поэтому я знаю, что делаю что-то не так.

1 Ответ

4 голосов
/ 30 августа 2010

С SQLite вы не можете обновить базу данных, пока вы еще выполняете выбор.Вам нужно заставить запрос select завершить и сохранить все данные, а затем выполнить цикл.Я думаю, что это сделает работу (не проверено):

dealer = list(dealers.select().order_by(asc(dealers.c.id)).execute())

Другой вариант - сделать несколько более сложный оператор SQL, чтобы цикл выполнялся внутри базы данных, а не в Python.Это, безусловно, даст вам прирост производительности.

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