База данных для Python 3? - PullRequest
       11

База данных для Python 3?

3 голосов
/ 10 октября 2009

Я пишу небольшую часть серверного программного обеспечения для личного использования несколькими пользователями. Не сотни, не тысячи, а, возможно, 3-10 одновременно.

Поскольку это многопоточный сервер, SQLite не работает. Он жалуется на такие темы:

ProgrammingError: объекты SQLite, созданные в потоке, могут использоваться только в этом же потоке. Объект был создан в идентификаторе потока 140735085562848, а это идентификатор потока 4301299712

Кроме того, они говорят, что SQLite в любом случае не подходит для параллелизма.

Теперь, так как я начал работать с Python 3 (и предпочел бы продолжать его использовать), я не могу заставить модуль MySQL работать должным образом, а другие кажутся одинаково разочарованными.

В таком случае, есть ли какая-либо другая опция БД для Python 3, которую я мог бы рассмотреть?

Ответы [ 6 ]

7 голосов
/ 10 октября 2009

Первое замечание: sqlite является поточно-ориентированным

$ python
Python 2.5.2 (r252:60911, Jul 31 2008, 17:28:52)
[GCC 4.2.3 (Ubuntu 4.2.3-2ubuntu7)] on linux2
Type "help", "copyright", "credits" or "license" for more information.
>>> import sqlite
>>> sqlite.threadsafety
1

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

Я делаю это, используя локальное хранилище потока для кэширования дескриптора базы данных, поэтому в каждом потоке есть только один. Примерно так ... (из проги py2.5 - надеюсь, она будет работать с 3.0!)

import threading

class YourClass:
    def __init__(self):
        #...
        self.local = threading.local()  # Thread local storage for db handles
        self.db_file = "/path/to/db"
        #...
    def db_open(self):
        if not getattr(self.local, "db", None):
            self.local.db = sqlite3.connect(self.db_file)
        return self.local.db
1 голос
/ 02 июня 2012

pymongo теперь работает с Python 3.

1 голос
/ 11 октября 2009

Я знаю, что есть какой-то драйвер Python для Firebird , но я не знаю, существуют ли некоторые для Python 3. Возможно, вы можете спросить в Firebird-Python список поддержки

1 голос
/ 10 октября 2009

Я сделал порт psycopg2 для Python 3.

0 голосов
/ 11 октября 2009

Конечно, прагматичный вариант - просто использовать одно соединение SQLite на поток.

0 голосов
/ 10 октября 2009

Вы можете создать новый объект sqlite в каждом потоке, каждый из которых использует один и тот же файл базы данных. Для такого небольшого количества пользователей вы можете не столкнуться с проблемами с параллелизмом, если только они все не пишут в него очень сильно.

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