2016-04-02 4 views
0

Я пытаюсь запустить скрипт python (createdb.py), который имеет операции DB из моего основного сценария python (app.py), но имеющий ошибка ниже.Python & SnakeSQL - raise lock.LockError ('Lock больше не действителен.') ERROR

Traceback (most recent call last): 
    File "C:\Python27\lib\site-packages\web\application.py", line 236, in process 
    return self.handle() 
    File "C:\Python27\lib\site-packages\web\application.py", line 227, in handle 
    return self._delegate(fn, self.fvars, args) 
    File "C:\Python27\lib\site-packages\web\application.py", line 409, in _delegate 
    return handle_class(cls) 
    File "C:\Python27\lib\site-packages\web\application.py", line 384, in handle_class 
    return tocall(*args) 
    File "D:\Python\virtualenvs\new4\textweb\bin\app.py", line 16, in GET 
    createdb.createTables() 
    File "D:\Python\virtualenvs\new4\textweb\bin\createdb.py", line 9, in createTables 
    cursor.execute("CREATE TABLE table (dateColumn Date, numberColumn Integer)") 
    File "D:\Python\virtualenvs\new4\textweb\bin\SnakeSQL\driver\base.py", line 1548, in execute 
    self.info = self.connection._create(parsedSQL['table'], parsedSQL['columns'], parameters) 
    File "D:\Python\virtualenvs\new4\textweb\bin\SnakeSQL\driver\base.py", line 993, in _create 
    self._insertRowInColTypes(table) 
    File "D:\Python\virtualenvs\new4\textweb\bin\SnakeSQL\driver\base.py", line 632, in _insertRowInColTypes 
    ], types= ['String','String','String','Bool','Bool','Bool','Text','Text','Integer'] 
    File "D:\Python\virtualenvs\new4\textweb\bin\SnakeSQL\driver\dbm.py", line 61, in _insertRow 
    self.tables[table].file[str(primaryKey)] = str(values) 
    File "D:\Python\virtualenvs\new4\textweb\bin\SnakeSQL\external\lockdbm.py", line 50, in __setitem__ 
    raise lock.LockError('Lock no longer valid.') 
LockError: Lock no longer valid. 

Это мой код создан.

import SnakeSQL 

connection = SnakeSQL.connect(database='test', autoCreate=True) 
connection = SnakeSQL.connect(database='test') 

cursor = connection.cursor() 

def createTables(): 
    cursor.execute("CREATE TABLE table (dateColumn Date, numberColumn Integer)") 
    cursor.execute("INSERT INTO table (dateColumn, numberColumn) VALUES ('2003-11-8', 3)") 
    cursor.execute("INSERT INTO table (dateColumn, numberColumn) VALUES ('2004-11-8', 4)") 
    cursor.execute("INSERT INTO table (dateColumn, numberColumn) VALUES ('2005-11-8', 5)") 
    cursor.execute("INSERT INTO table (dateColumn, numberColumn) VALUES ('2006-11-8', 6)") 


def select(): 
    selectResult = cursor.execute("SELECT dateColumn FROM table WHERE numberColumn = 3") 
    return selectResult 

if __name__ == "__main__": 
    createTables() 

и вот мой app.py код;

import web 
import SnakeSQL 
import createdb 

render = web.template.render('templates/') 

connection = SnakeSQL.connect(database='test') 
cursor = connection.cursor() 

urls = (
    '/', 'index' 
) 

class index: 
    def GET(self): 
     createdb.createTables() 
     result = createdb.select() 
     return render.index(result) 


if __name__ == "__main__": 
    app = web.application(urls, globals()) 
    app.run() 

Я не мог понять, почему у меня такая ошибка. Можете ли вы поделиться своими знаниями для решения этой проблемы?

+0

Не использовали SnakeSql, но я не могу себе представить, что вы когда-либо захотите сделать «курсором» константу на уровне модуля. Попробуйте создать курсор (-ы) внутри ваших методов. – Gerrat

+0

На самом деле я уже пробовал, но потом получил еще одну ошибку, так как для курсора нет глобальной константы. Вот почему я переместил его вне функции. –

+0

Да, вам нужно либо создать курсор в каждой функции, которая его использует, либо передать в качестве параметра. (Эта часть действительно не имеет ничего общего с SnakeSQL - это просто то, как работают функции на Python, и почти все остальные языки программирования работают). – Gerrat

ответ

1

Во-первых, SnakeSQL docs, по-видимому, с 2004 года, фактический код был последний раз обновлен в 2009 году, и автор утверждает, что проект больше не поддерживается. Вы можете захотеть использовать то, что все еще активно поддерживается.

docs также упомянуть:

В теории, один из процессов, имеющих доступ к базе данных может застрять в бесконечном цикле, а не снять блокировку базы данных, чтобы разрешить другим пользователям доступ к нему. По истечении 2 секунд, если процесс с текущей блокировкой базы данных не получает к нему доступа, блокировка будет освобождена, а другой процесс может получить блокировку. Первый процесс сам придется ждать, чтобы получить блокировку.

Оглядываясь на ваш след, я сделаю обоснованное предположение, что, поскольку вы помещаете курсор на уровень модуля (что опять же, вероятно, вы не хотите делать), он создал курсор, когда модуль был первым импортируется, то к тому времени, когда ваша программа фактически выполнила функцию createTables, прошло более 2 секунд, и она отказалась от блокировки.

Попробуйте переместить линию, чтобы создать курсор внутри ваших методов:

def createTables(): 
    cursor = connection.cursor() 
    cursor.execute("CREATE TABLE table (dateColumn Date, numberColumn Integer)") 
    cursor.execute("INSERT INTO table (dateColumn, numberColumn) VALUES ('2003-11-8', 3)") 
    cursor.execute("INSERT INTO table (dateColumn, numberColumn) VALUES ('2004-11-8', 4)") 
    cursor.execute("INSERT INTO table (dateColumn, numberColumn) VALUES ('2005-11-8', 5)") 
    cursor.execute("INSERT INTO table (dateColumn, numberColumn) VALUES ('2006-11-8', 6)") 


def select(): 
    cursor = connection.cursor() 
    selectResult = cursor.execute("SELECT dateColumn FROM table WHERE numberColumn = 3") 
    return selectResult 

(и сделать то же самое в вашем коде app.py).

+0

Благодарим вас за ответ. Это действительно помогло мне. После вашего предложения я также планирую изменить свой выбор БД. –

Смежные вопросы