2016-01-15 4 views
0

У меня возникли проблемы с использованием многопроцессного процесса в sqlite3. Код:ошибка многопроцессорности python при использовании sqlite3

import multiprocessing 
import sqlite3 
class DealProcess(multiprocessing.Process): 
    def __init__(self): 
     super(DealProcess, self).__init__() 
     ''' 
     CREATE TABLE people (id text, name text) 
     INSERT INTO people (id, name) VALUES ('1', 'jack') 
     ''' 
     self.conn = sqlite3.connect('people.sqlite') 

    def __get_people(self): 
     cur = self.conn.cursor() # This not work, the following is OK,Why? 
     # conn = sqlite3.connect('people.sqlite') 
     # cur = conn.cursor() 
     cur.execute('SELECT * FROM people') 
     return cur.fetchall() 

    def run(self): 
     for people in self.__get_people(): 
      print people 

if __name__ == '__main__': 
    p = DealProcess() 
    p.start() 

Когда я инициализировать self.conn в __init__, он не работает в __get_people. Ошибка сообщения:

cur.execute('SELECT * FROM people') 
OperationalError: no such table: people 

Я не знаю, что вызывает его. Когда я напрямую использую raw connect, как аннотации, он работает хорошо. Благодарю.

ответ

0

Ваша проблема заключается в том, что вы забыли фактически выполнить свой CREATE TABLE..., так как это просто Multi line comment в верхней части вашей функции __init__.

Попробуйте переместить его после создания и запуска self.conncursor().execute на нем.

import multiprocessing 
import sqlite3 
class DealProcess(multiprocessing.Process): 
    def __init__(self): 
     super(DealProcess, self).__init__() 
     self.conn = sqlite3.connect('people.sqlite') 
     self.conn.cursor().execute(''' 
      CREATE TABLE people (id text, name text) 
      INSERT INTO people (id, name) VALUES ('1', 'jack') 
     ''') 

    def __get_people(self): 
     cur = self.conn.cursor() # This not work, the following is OK,Why? 
     # conn = sqlite3.connect('people.sqlite') 
     # cur = conn.cursor() 
     cur.execute('SELECT * FROM people') 
     return cur.fetchall() 

    def run(self): 
     for people in self.__get_people(): 
      print people 

if __name__ == '__main__': 
    p = DealProcess() 
    p.start() 

На ускоряющемся поезде, и у меня нет Python на ноутбуке, поэтому синтаксис может быть выключен.
Или может быть сбой в том, как я использую функцию .execute, если так, пожалуйста, исправьте меня, если я не сделаю это до этого. Но это дает вам представление о том, что не так.

+0

Я имею в виду ** people.sqlit ** уже существует и имеет таблицу * people *. Затем запустите код python, '__get_people' работает неправильно. –