2009-09-10 37 views
7

什么是使用嵌入式数据库的最佳方式,说的SQLite在Python:蟒蛇数据库/ SQL编程 - 从哪里开始

  1. 应该是占地面积小。我只需要每张表几千条记录。每个数据库只有少数几个表。
  2. 如果它是由Python默认安装提供的,那么很好。必须是开源的,可在Windows和Linus上使用。
  3. 如果SQL没有直接写入,但没有完全需要ORM,则更好。有些东西会使我远离实际的数据库,但不是那么庞大的图书馆。类似于ADO的东西会很棒。
  4. 大部分将通过代码使用,但如果有一个GUI前端,那很好
  5. 只需几页即可开始使用。我不想浏览阅读什么表格以及Select语句如何工作的页面。我知道所有这一切。
  6. 支持Python 3是首选,但2.x也可以。

该用法不是一个web应用程序。这是一个容纳最多5个表的小型数据库。每个表中的数据只是几个字符串列。想一些比腌字典大的东西

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

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

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

你可能不会启动一个Office Word/Writer来写一个小的文章它类型的笔记,同样我不愿意在这个用例中使用像Django这样的东西。

从哪里开始?

+0

这是一个网络或桌面应用程序? – 2009-09-10 19:43:40

+0

不是web应用程序。几乎不是桌面应用程序。对于这种特殊情况,我需要存储一些关于许多文件和一些内容的元数据。除调试外,并不需要CRUD和UI。 – Ayman 2009-09-10 20:02:18

+0

我不明白这个'轻量级'的要求,以及ORM如何不适合。 “重量级”你的意思是:1.太复杂了2.内存/磁盘需求? 3.功能太多? – 2009-09-11 16:04:36

回答

1

这是答案的集合体,没有特定的顺序:

每个人都在建议的ORM层。如果你真的需要一个数据库,这是非常有意义的。嗯,这是有点要求的称号:-)

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

但我开始觉得,如果一个内存数据库是足够的,在此将脚本,而非一个Web应用程序,甚至是桌面GUI使用,则选择7也是完全有效的,提供不需要交易支持,“数据库”完整性不成问题。

+0

如果你决定使用SQLite,那么SQLiteSpy(http://www.yunqa.de/delphi/doku.php/products/sqlitespy/index)就是GUI前端。我个人会在Elixir中使用SQLAlchemy,但我不得不承认我从未使用过Autumn(现在看一看) – van 2009-09-11 07:04:27

+0

@Ayman:SQLite可以存储在内存中,对于某些操作(例如,agregation),SQLite可能比Python的操作更快对象,因为它存储值,而不是对象。应该剖析并看看... – voyager 2009-09-11 14:53:41

2

开始使用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的人):)

+0

Django虽然很棒,但对我的需求来说太“沉重”了。需要更小的占地面积。 – Ayman 2009-09-10 19:43:51

+0

是什么让它“沉重”?你在说什么“脚印”? – 2009-09-11 16:02:34

3

我开始了在这里:

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

它的5(短)只要领页让我去的时候了。

+0

考虑到该帖子的日期... http://docs.python.org/library/sqlite3.html 自Python 2.5以来,pysqlite已经可以作为sqlite3使用。 – 2009-09-10 21:00:56

+0

我认为像ORM这样的ORM是一种使用数据库更简单的方法。 SQL可能非常棘手;有一个ORM隐藏这些混乱的细节是非常好的,只关注你的数据以及你想要做什么。 – steveha 2009-09-10 22:07:58

+0

@steveha:这取决于你在做什么以及你对SQL的理解。 如果您的需要仅仅是将对象存储在数据库中,那么ORM是可以接受的,但有时您的需求可能不适合ORM的功能。 – voyager 2009-09-11 14:47:32

0

Django对此非常完美,但海报并不清楚他是否需要真正编译EXE或Web应用程序。 Django仅适用于Web应用程序。

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

+0

@Stephen答案非常接近我想要的。我正在创建一个Web应用程序,所以我不认为我需要Django。 – Ayman 2009-09-10 19:58:47

+0

@Ayman:你可以使用Django的ORM单机版。尽管如此,它可能不符合您的小尺寸要求。 – voyager 2009-09-11 14:49:56

6

我强烈建议使用良好的ORM。当您可以使用Python对象来管理数据库行时,生活就会变得更加简单。

我是Django ORM的粉丝。但那已经是建议了,你说这太重了。

这给我留下了恰好一个ORM推荐:Autumn。非常轻量级,适用于SQLite。如果你的嵌入式应用程序是多线程的,那么你绝对需要Autumn;它有支持多线程SQLite的扩展。 (完全披露:我写了这些扩展名并贡献了他们,我在为RealNetworks工作时写了他们,而我的老板们允许我将它们捐赠出去,所以公众对RealNetworks表示感谢。)

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

我不推荐APSW。在我的愚见中,这对帮助你并没有太大的帮助;它只是提供了一种执行SQL语句的方法,并让您掌握SQL的做事方式。此外,它支持SQLite的每一个功能,甚至是你很少使用的功能,因此它实际上比秋天有更大的内存占用,而不是很容易使用。

3

您正在寻找的是SQLAlchemy,它正在迅速成为事实上的标准Python数据访问层。为了让您的SQLAlchemy的第一次体验变得更加容易,请查看Elixir,这是一个SQLAlchemy周围精简的ActiveRecord风格的包装器。

更新:重读这个问题,看到了不需要一个完整的ORM。我仍然建议使用SQLAlchemy路由,仅仅是因为它为您提供了一种简单易用的方法来处理Python中的数据库,您可以重复使用它来处理任何类型的数据库。一旦你需要连接到Oracle或其他东西,直接使用SQLite所花费的时间就会被浪费掉。

+0

我曾与SQLAlchemy合作,这是非常好的。但是,它的内存占用量要比秋天大得多,并且具有嵌入式应用不太可能需要的功能。 我们在RealNetworks的项目开始使用SQLAlchemy,调用APSW,然后切换到秋季。 (我同意他不应该尝试直接使用SQLite,但我认为他不太可能尝试将Oracle嵌入到嵌入式应用程序中。) – steveha 2009-09-10 21:29:06

+0

@steveha,我不是建议他会需要将Oracle嵌入到一个类似的小程序中。我建议在某个时候他需要连接到另一种类型的数据库,并且学习一种强大而多样的方式可以让他的生活更轻松。 – Kevin 2009-09-10 22:41:16

+0

@凯文:够公平的。而且你明确地说过“连接Oracle”而不是“嵌入Oracle”......对此抱歉。 – steveha 2009-09-10 22:44:47

0

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

0

有符合所有既定目标的易于使用Python模块:

​​

序列化+持久性:在几行代码,压缩和注释Python对象为SQLite的;然后稍后通过没有任何SQL的关键字按时间顺序检索它们。最有用的“标准”模块,用于数据库存储无模式数据。令人惊讶的是,对于大多数实际用途而言,内存和持久解决方案之间没有太大差别。至于“用真正的数据库来屏蔽我”,用y_serial,我们甚至不能说SQLite是背后的一切。如果您将记录构建为Python字典,则可以专注于编写代码(而非存储过程)。

0

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