【问题标题】:python database / sql programming - where to startpython数据库/sql编程——从哪里开始
【发布时间】:2009-09-10 19:31:36
【问题描述】:

使用嵌入式数据库的最佳方式是什么,比如 Python 中的 sqlite:

  1. 占用空间应该很小。我只需要每张表几千条记录。每个数据库只有几个表。
  2. 如果它是 Python 默认安装提供的,那就太好了。必须是开源的,可在 Windows 和 Linus 上使用。
  3. 最好不直接编写 SQL,但完全不需要 ORM。可以保护我免受实际数据库的影响,但不会像图书馆那么大。类似于 ADO 的东西会很棒。
  4. 主要是通过代码使用,但如果有 GUI 前端,那就太好了
  5. 只需几页即可开始使用。我不想通过页面阅读表格是什么以及 Select 语句是如何工作的。我都知道。
  6. 首选支持 Python 3,但 2.x 也可以。

使用不是网络应用程序。这是一个小型数据库,最多可容纳 5 个表。每个表中的数据只是几个字符串列。想想比腌制字典更大的东西

更新:非常感谢您的建议。
我正在谈论的用例相当简单。您可能会在一两天内完成。
这是一个 100 多行的 Python 脚本,它收集关于相对大量文件(比如 10k)的数据,并创建关于它们的元数据文件,然后创建一个关于整个文件树的大型元数据文件。我只需要避免重新处理已经处理的文件,并为更新的文件创建元数据,并更新主元数据文件。在某种程度上,缓存处理过的数据,并且只在文件更新时更新它。 如果缓存损坏/不可用,则只需处理整个树。这可能需要 20 分钟,但没关系。

请注意,所有处理都在内存中完成。

我想避免任何外部依赖,以便脚本可以轻松地放在任何系统上,只需安装 Python。作为 Windows,有时很难安装所有组件。 所以,在我看来,即使是数据库也可能是矫枉过正。

您可能不会启动 Office Word/Writer 来写一个小型的便笺式便笺,同样我也不愿意在这个用例中使用 Django 之类的东西。

从哪里开始?

【问题讨论】:

  • 这是一个网络或桌面应用程序?
  • 不是网络应用程序。几乎是一个桌面应用程序。对于这种特殊情况,我需要存储一些关于许多文件及其一些内容的元数据。除了调试之外,实际上并不需要 CRUD 和 UI。
  • 我不明白这个“轻量级”要求以及 ORM 是如何不适合的。您所说的“重量级”是指:1. 太复杂而无法计算 2. 内存/磁盘要求? 3. 功能太多?

标签: python database sqlite ado


【解决方案1】:

我强烈推荐使用好的 ORM。当您可以使用 Python 对象来管理数据库行时,生活就轻松多了。

我是 Django 中的 ORM 的粉丝。不过已经推荐过了,你说太重量级了。

这让我只需要推荐一个 ORM:Autumn。非常轻量级,与 SQLite 配合得很好。如果您的嵌入式应用程序将是多线程的,那么您绝对想要 Autumn;它具有支持多线程 SQLite 的扩展。 (完全披露:我编写了这些扩展并贡献了它们。我在为 RealNetworks 工作时编写了它们,我的老板允许我捐赠它们,因此公开感谢 RealNetworks。)

Autumn 是用纯 Python 编写的。对于 SQLite,它使用 Python 官方 SQLite 模块来执行实际的 SQL 工作。 Autumn 本身的内存占用很小。

我不推荐 APSW。以我的拙见,它对您的帮助并不大。它只是提供了一种执行 SQL 语句的方法,让您掌握 SQL 的做事方式。此外,它支持 SQLite 的每一个特性,甚至是你很少使用的特性,因此它实际上比 Autumn 具有更大的内存占用,但并不容易使用。

【讨论】:

    【解决方案2】:

    我从这里开始:

    http://www.devshed.com/c/a/Python/Using-SQLite-in-Python

    它只有 5 页(短),只有基本要领让我马上就开始了。

    【讨论】:

    • 考虑到该帖子的发布日期...docs.python.org/library/sqlite3.html pysqlite 自 Python 2.5 起就以 sqlite3 的形式提供。
    • 我认为像 Autumn 这样的 ORM 是一种更容易使用数据库的方法。 SQL 可能很棘手;让 ORM 隐藏杂乱的细节真是太好了,只关注你的数据和你想用它做什么。
    • @steveha:这取决于你在做什么,以及你对 SQL 的理解。如果您的需求只是将对象存储在数据库中,那么 ORM 是可以接受的,但有时您的需求可能不适合 ORM 的功能。
    • 走这条路,你会破解一些类似于 Django 提供的东西。
    【解决方案3】:

    您正在寻找的是SQLAlchemy,它正在迅速成为事实上的标准 Python 数据访问层。为了让您的 SQLAlchemy 初体验更加轻松,请查看 Elixir,它是 SQLAlchemy 的一个精简的 ActiveRecord 样式包装器。

    更新:重新阅读问题,发现不需要完整的 ORM。我仍然建议走 SQLAlchemy 路线,因为它为您提供了一种非常简单的方式来使用 Python 中的数据库,您可以将其重用于任何类型的数据库。一旦您需要连接到 Oracle 或其他东西,直接使用 SQLite 所花费的时间就被浪费了。

    【讨论】:

    • 我使用过 SQLAlchemy,它非常好。但是,它的内存占用比 Autumn 大得多,并且它具有嵌入式应用程序不太可能需要的功能。我们在 RealNetworks 的项目一开始使用的是 SQLAlchemy,后来又使用了 APSW,然后切换到了 Autumn。 (我同意他不应该尝试直接使用 SQLite,但我确实认为他不太可能尝试将 Oracle 嵌入到嵌入式应用程序中。)
    • @steveha,我并不是说他需要将 Oracle 嵌入到类似的小程序中。我建议他在某些时候需要连接到不同类型的数据库,并且学习一种强大且通用的方法将使他的生活更轻松。
    • @Kevin:很公平。而且您确实明确地说“连接到 Oracle”而不是“嵌入 Oracle”......对此感到抱歉。
    【解决方案4】:

    从 Django 开始

    http://www.djangoproject.com/

    ORM 是通往这里的道路。你不会后悔的。 http://docs.djangoproject.com/en/dev/intro/tutorial01/这里的教程比较温和。

    为什么选择 Django/ORM? Django 将在大约半小时内让您运行起来,将管理您的数据库连接、数据管理接口等。Django 使用 SQLLite:您不需要管理 MySQL/PostGre 实例。

    EDIT1:您不需要为此使用 Django 的 web-app 部分。您可以使用 db.Model 类直接操作数据。无论你想出什么独立的应用程序/脚本,你都可以使用 Django 数据模型层。当你决定想要一个网络前端,或者至少想通过管理控制台编辑你的数据时——你可以在这里发帖感谢我(或者说使用 ORM 的每个人):)

    【讨论】:

    • Django,尽管它很棒,但对我的需求来说太“重”了。需要更小的占用空间。
    • 是什么让它“沉重”?你在说什么“足迹”?
    【解决方案5】:

    这是答案的汇总,没有特定的顺序:

    每个人都在推荐 ORM 层。如果您真的需要数据库,这很有意义。嗯,这是标题中要求的:-)

    1. SQLAlchemy
    2. Autumn
    3. Django ORM
    4. 使用SQLite官方支持Pysqlite
    5. Storm
    6. Elixir
    7. 只需使用 Python 自己的 Pickle

    但是我开始认为,如果内存数据库就足够了,那么它将仅用于脚本,而不是 Web 应用程序甚至桌面 gui,那么选项 7 也是完全有效的,前提是没有事务需要支持,“数据库”完整性不是问题。

    【讨论】:

    • 如果您决定使用 SQLite,那么 SQLiteSpy (yunqa.de/delphi/doku.php/products/sqlitespy/index) 将是 GUI 前端。我个人会将 SQLAlchemy 与 Elixir 一起使用,但我不得不承认我从未使用过 Autumn(现在看看)
    • @Ayman:SQLite 可以存储在内存中,并且对于某些操作(例如聚合)可能比 Python 对对象的操作更快,因为它存储的是值,而不是对象。应该配置文件并查看...
    【解决方案6】:

    Django 非常适合此功能,但发帖者不清楚他是否需要实际制作已编译的 EXE 或 Web 应用程序。 Django 仅适用于 Web 应用程序。

    我不确定你真正从哪里得到“沉重”。就代码行数而言,Django 比任何其他主要的 Web 应用程序框架都要小得多。

    【讨论】:

    • @Stephen 的答案非常接近我想要的。我正在创建一个网络应用程序,所以我认为我不需要 Django。
    • @Ayman:您可以单独使用 Django 的 ORM。不过,它可能无法满足您的小尺寸要求。
    【解决方案7】:

    添加到其他好建议的另一个选项:Elixir。它在SQLAlchemy 之上提供了一个简化的声明层,因此应该更容易深入研究,但它也允许您在需要时调用SQLAlchemy 的全部功能。

    【讨论】:

      【解决方案8】:

      有一个易于使用的 Python 模块可以满足所有既定目标:

      http://yserial.sourceforge.net/

      序列化+持久化:在几行代码中,将Python对象压缩并注解成SQLite;然后在没有任何 SQL 的情况下按时间顺序检索它们。数据库存储无模式数据的最有用的“标准”模块。

      令人惊讶的是,对于大多数实际用途而言,内存解决方案和持久解决方案之间并没有太大区别。

      至于“保护我免受实际数据库的影响”,使用 y_serial,我们甚至无法判断 SQLite 是这一切的幕后黑手。如果您将记录构建为 Python 字典,则可以专注于编写代码(而不是存储过程)。

      【讨论】:

        【解决方案9】:

        如果您不想使用 ORM,可以尝试python-sql 来创建您的 SQL 查询。

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 1970-01-01
          • 2010-10-20
          • 1970-01-01
          • 2018-10-18
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          相关资源
          最近更新 更多