【问题标题】:A database for python 3?python 3的数据库?
【发布时间】:2023-04-05 10:36:01
【问题描述】:

我正在编写一个供多个用户个人使用的服务器软件。不是数百个,也不是数千个,但一次可能有 3-10 个。

因为它是一个线程服务器,所以 SQLite 不能工作。它抱怨这样的线程:

ProgrammingError: SQLite objects created in a thread can only be used in the same thread.The object was created in thread id 140735085562848 and this is thread id 4301299712

此外,他们说 SQLite 无论如何都不适合并发。

现在自从我开始使用 Python 3(并且宁愿继续使用它)以来,我似乎无法让 MySQL 模块正常工作,而其他人似乎同样感到沮丧。

在这种情况下,我可以考虑是否有其他适用于 Python 3 的数据库选项?

【问题讨论】:

  • 是的,Python 3 还没有真正准备好使用。人们终于可以开始移植库了,如果你今天想继续使用 Python 3,你很可能需要做很多事情。
  • 如果项目不需要(也不会需要)任何尚未移植的库,则该项目已准备好。
  • 我想我是这样的先驱。

标签: python database python-3.x


【解决方案1】:

我知道Firebird 有一些Python driver,但我不知道Python 3 是否有一些。也许你可以在Firebird-Python support list 中询问

【讨论】:

【解决方案2】:

pymongo 现在可以与 Python 3 一起使用。

【讨论】:

    【解决方案3】:

    当然,一个务实的选择是每个线程只使用一个 SQLite 连接。

    【讨论】:

      【解决方案4】:

      首先注意sqlite is thread safe

      $ 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 prog - 希望它可以与 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
      

      【讨论】:

      • 这很有趣,据说它不是线程安全的。很高兴知道它是。 :)
      • 我知道我迟到了大约一年,但是在打开 sqlite 连接时传递 check_same_thread=False 然后只使用一个跨线程连接不起作用是有原因的吗?
      • 我建议您看一下 sqlite 线程常见问题解答条目:sqlite.org/faq.html#q6 - 看起来它是新支持的,但有很多警告。我个人的看法是,考虑到我在使用 sqlite 和线程方面遇到的麻烦,我一般会避免它!
      【解决方案5】:

      您可以在每个线程中创建一个新的 sqlite 对象,每个线程都使用相同的数据库文件。对于这么少的用户,您可能不会遇到并发问题,除非他们都非常大量地写入。

      【讨论】:

      • 我想过。但话又说回来,他们可能会遇到问题。我不完全确定他们会写多少。
      【解决方案6】:

      我对 Python 3 做了一个 port 的 psycopg2。

      【讨论】:

        猜你喜欢
        • 2014-03-21
        • 2017-08-27
        • 2023-04-07
        • 2018-10-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多