使用CSV作为Web应用程序的数据库有问题吗?

3

我正在使用Flask制作一个小型的Web应用程序来管理一个团队项目,在这个网站上,我需要管理出勤情况以及会议报告。由于没有时间学习SQLAlchemy,所以我想知道使用CSV作为数据库可能存在哪些问题。


3
没有并发,更新行的速度慢且困难,无法进行查询? - Fabricator
4个回答

7

不要使用CSV作为后端,原因如下:

a、无法并发:这意味着当两个人同时访问您的应用程序时,无法确保他们不会干扰彼此,更改彼此的数据。使用CSV文件作为后端时,没有解决此问题的方法。

b、速度:每当您对CSV文件进行更改时,都需要重新加载整个文件。解析文件会消耗大量内存和时间。

数据库是为解决这些问题而创建的。

然而,我同意对于小型应用程序,您不需要学习SQLAlchemy。

有一些轻量级的替代方案值得考虑。

您要寻找的是ORM - 对象关系映射 - 它将Python代码转换为SQL,并为您管理SQL数据库。

PeeweeORMPonyORM。两者都易于使用,并将所有SQL转换为Python,反之亦然。个人使用免费,但如果您将其用于商业目的,则Pony需付费。我强烈推荐PeeweeORM。您可以使用SQLite作为Peewee的后端,或者如果您的应用程序变得更大,可以轻松地插入MySQL或PostGreSQL。


1
不要这样做,指的是CSV。
还有许多其他可能性,例如sqlite数据库、python shelve等。标准库中提供的选项在此处进行了总结。
考虑到您的应用程序是Web应用程序,您需要考虑并发对解决方案的影响,以确保数据完整性。您还可以考虑使用更强大的数据库,如Postgres,针对该数据库有许多Python库可供选择。

1
只要你抽象化它,我认为这样做没有问题。也就是说,确保你在所写内容和实现方式之间有一个清晰的分离。这会使你的代码变得臃肿一些,但它将确保你可以在几天内更换CSV存储。
也就是说,假装你可以将数据持久化,就像将其保存在内存中一样。不要在你的flask应用程序中写入“openCSVFile”。使用initPersistence()。不要编写“csvFile.appendRecord()”。使用“persister.saveNewReport()”。当你真正意识到CSV是一个瓶颈时,你可以编写一个新的持久化插件。
还有其他好处,比如你不必在测试中使用模拟库来加快测试速度。你只需要提供另一个持久化器。

0

我对于有多少人反对使用CSV作为数据库存储后端格式感到非常困惑。

并发性:没有理由不使用并发性与CSV。就像数据库线程可以同时写入二进制文件的一个区域,而另一个线程可以写入同一二进制文件的另一个区域一样。数据库可以用CSV文件做到完全相同的事情。就像日志用于维护单个事务的原子性一样,CSV也可以做到完全相同的事情。
速度:为什么数据库要一次读取和写入整个文件,当它可以像对待所有其他数据库存储格式一样,查找索引文件中记录的起始字节,并在常数时间内定位到该字节并覆盖数据,注释掉剩余的任何内容并记录自由空间以备后用?就像数据库可以将任何不需要的二进制“行”的字节清零并在单独的索引文件中记录自由空间一样。我真的不明白这种对非二进制格式的敌意,因为可以用一种格式做的一切都可以用另一种格式做到... 除了特定CSV语法中使用的原始二进制数据压缩(特殊的二进制注释等)。
紧急访问:CSV的附加好处是,当数据库死机时,你还有一个CSV文件可以在紧急情况下快速访问... 这是我永远不会使用二进制存储关键数据的主要原因,因为即使由于不称职的编程而导致数据库崩溃,这些数据也应该能够快速访问。

是的,如果您在电子表格程序中更改了CSV文件,则每次都必须重新索引它,但这与在索引/表损坏/删除/失去同步等情况下重新索引二进制数据库没有区别。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接