在Django中使用SQLite进行制作?

Abd*_*hab 25 sqlite django

对不起这个问题,我不知道我是否理解这个概念,但是SQLite是无服务器的,这意味着数据库在本地机器中,并且它存储在一个文件中,这个文件只能在一种模式下访问:如果一个客户端读取它,它仅用于其他客户端的读取模式,如果客户端写入,则所有客户端都具有写入模式,因此一次只能在一种模式下!所以想象一下,我做了一个django应用程序,例如博客; 那怎么用sqlite做的呢?因为如果客户进入博客,他会在阅读模式下查看页面和博客条目,如果注册客户端尝试添加评论,那么该文件将被设置为写入模式,那么sqlite如何处理这个?那么,SQLite是否就像BaseHTTPServer(django附带的服务器)一样,用于测试和学习目的?

Sin*_*ion 38

不同的数据库以不同的方式管理并发,但在sqlite中,使用的方法是全局数据库级锁.只有一个线程或进程可以一次更改sqlite数据库; 所有其他并发进程将被迫等待当前正在运行的进程完成.

随着您的用户数量的增长; sqlite的简单锁定策略将导致越来越大的锁争用,并且您需要将数据迁移到另一个数据库,例如MySQL(可以进行行级锁定,至少使用InnoDB引擎)或PostgreSQL(使用多版本并发控制) .如果您预计将获得大量用户(在某一天的大部分时间内,每秒超过1个请求),您应该从sqlite迁移; 越早你这样做,就越容易.

  • 好吧,如果你从我那里征求意见,那么是的,我确实认为PostgreSQL更好.但是,这不适合进行这种讨论; 也许请查看[wikipedia](http://en.wikipedia.org/wiki/Comparison_of_relational_database_management_systems)进行客观比较. (9认同)

Uku*_*kit 8

数据库理论中的这个问题称为并发,SQLite在Windows版本> Win98和其他地方根据常见问题解答支持它:

http://www.sqlite.org/faq.html#q5

我们知道没有其他嵌入式SQL数据库引擎支持与SQLite一样多的并发性.SQLite允许多个进程一次打开数据库文件,并允许多个进程一次读取数据库.当任何进程想要写入时,它必须在更新期间锁定整个数据库文件.但这通常只需要几毫秒.其他流程只是等待作者完成然后继续他们的业务.其他嵌入式SQL数据库引擎通常只允许单个进程一次连接到数据库.

基本上,不要担心并发性,任何值得盐的数据库都可以正常使用.有关SQLite3如何管理此问题的更多信息,请参见此处.作为开发人员,您不是数据库设计师,除非您对内部工作感兴趣,否则无需关心它.


Rob*_*rne 8

SQLite 仅在某些特定情况下才能在生产中有效工作。即使在 Windows 上,启动并运行 MySQL 或 PostgreSQL 也非常容易,并且拥有一个适用于大多数情况的数据库。

真正的问题是 SQLite3 没有在 Django 中线程化,因此服务器上一次只能发生一个页面视图,请参阅此错误https://code.djangoproject.com/ticket/12118 已修复

即使在开发中我也不使用 SQLite3。

编辑:我在这里一直被否决,但 Django 文档本身建议在我写这个答案时不要在生产中使用 SQLite3。该文档仍然包含以下警告:

SQLite 为主要是只读的或需要较小安装空间的应用程序提供了一个优秀的开发替代方案。

如果您没有小型/只读 Django 实例,请不要使用 SQLite3。请随意继续否决这个答案。

  • Sqlite 也适合教授数据库概念(因为它很容易设置)和研究(因为它的源代码小而简单)。对于这些事情中的每一个,SQLite 都非常出色。对于繁重的交易负载,有更好的选择。 (4认同)
  • “SQLite 并不是真正用于生产”这一说法是错误的。请参阅 SQLite 文档。 (3认同)
  • 是的,测试/开发。一旦你开始构建一个更复杂的站点,你将需要一个真正的数据库,并且你可能需要一些原始 SQL(我已经构建了 3 个 Django 站点,所有三个站点都需要一些原始 SQL 来进行几个查询) (2认同)

小智 7

SQLite是喜欢BaseHTTPServer或任何基本类似.它是一个功能齐全的嵌入式数据库.非常快.它的SQL语言可能没有最多的花里胡哨,但它足够灵活.我没有遇到过我需要为我参与的项目做不了的事情(这不是你的典型网络应用程序,事实上可以告诉我).

声称SQLite的任何人在没有讨论实际设计的情况下对生产的好坏都没有告诉你多少.SQLite非常快.在某些情况下,比Postgres更快几个数量级,后者在Djangonauts中成为替代选择.正如有人指出的那样,它也支持大量的并发性.这是一个问题,你的应用程序是否属于"某些情况".

现在,有一个重要因素需要考虑.SQLite是一个进程内数据库.这非常重要.如果您使用gevent之类的东西,则可能会遇到应用程序中断的边缘情况.例如,尝试执行一个事务,在其中间有一个上下文切换可能会以可怕的方式破坏事务.换句话说,"并发"实际上取决于您的应用程序,因为SQLite是您应用程序的一部分.

但是,就扩展而言,使用SQLite无法做到的是,您无法像使用其他一些数据库引擎一样创建SQLite服务器集群,因为它正在进行中.你的应用程序在扩展方面可能需要或可能不需要这么长,但我的猜测是绝大多数的应用程序都没有(无论如何).

另一方面,正在进行中意味着添加自定义函数和聚合是非常简单的.我不确定Django的ORM是否会让它变得更难,但是你可以利用这些功能提出相当不错的设计.