将CSV作为网页应用数据库有什么问题?

4 投票
4 回答
4266 浏览
提问于 2025-04-18 08:48

我正在用Flask制作一个小型网页应用,用来管理一个小组项目。在这个网站上,我需要管理考勤和会议报告。我没有时间去深入学习SQLAlchemy,所以我想知道使用CSV作为数据库可能会有什么不好的地方。

4 个回答

0

我真的很困惑,为什么这么多人不鼓励使用CSV作为数据库的存储格式。

  1. 并发性:没有任何理由说明CSV不能用于并发操作。就像数据库的线程可以同时在一个二进制文件的一个区域写入数据,而另一个线程可以在同一个文件的另一个区域写入数据一样。数据库可以用CSV文件做到完全相同的事情。就像日志用于保持单个事务的原子性,CSV也可以做到这一点

  2. 速度:为什么数据库要一次性读取和写入整个文件呢?数据库可以像处理其他存储格式一样,先在索引文件中查找记录的起始字节,然后快速定位到那里,覆盖数据,注释掉多余的部分,并在一个单独的索引文件中记录空闲空间,以便后续使用,就像数据库可以将二进制“行”中不需要的区域清零,并在单独的索引文件中记录空闲空间一样... 我实在不明白为什么对非二进制格式有这么大的敌意,毕竟用一种格式能做到的事情,另一种格式也能做到... 所有事情,除了可能的原始二进制数据压缩,这取决于使用的特定CSV语法(比如特殊的二进制注释等等)。

  3. 紧急访问:CSV的一个额外好处是,当数据库崩溃时(这不可避免会发生),你仍然可以快速访问CSV文件... 这也是我绝对不使用二进制存储来保存重要数据的主要原因,因为这些数据应该在数据库由于编程不当而崩溃时仍然能快速访问。

是的,每次在电子表格程序中对CSV文件进行更改时,都需要重新建立索引,但这和在索引/表损坏/删除/不同步等情况下重新建立二进制数据库的索引没有什么不同。

1

我觉得这样做没什么问题,只要你能把它抽象开来。也就是说,要确保你写的代码和实现的方式之间有清晰的分隔。这样虽然会让你的代码稍微变得复杂一些,但可以确保你在几天内就能更换你的CSV存储方式。

换句话说,假装你可以像在内存中一样保存数据。不要在你的Flask应用里写“openCSVFile”。而是用“initPersistence()”。不要写“csvFile.appendRecord()”,而是用“persister.saveNewReport()”。当你发现CSV成为瓶颈时,你只需要写一个新的持久化插件就行了。

这样还有额外的好处,比如在测试中你不需要使用模拟库来加快速度。你只需提供另一个持久化工具就可以了。

7

别这么做。

CSV文件的问题是……

a, 无法同时处理多个请求:这意味着当两个人同时使用你的应用时,没办法确保他们不会互相干扰,导致修改了对方的数据。用CSV文件作为后台是无法解决这个问题的。

b, 速度慢:每次你对CSV文件进行修改时,基本上都需要重新加载整个文件。解析这个文件会消耗很多内存和时间。

数据库就是为了处理这些问题而设计的。

不过,我同意,对于一个小应用来说,你不需要学习SQLAlchemy。

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

你需要的是ORM(对象关系映射),它可以把Python代码转换成SQL,并为你管理SQL数据库。

PeeweeORMPonyORM。这两个都很容易使用,可以把所有SQL转换成Python,反之亦然。个人使用是免费的,但如果你用Pony做商业用途就需要付费。我非常推荐PeeweeORM。你可以用Peewee开始使用SQLite作为后台,如果你的应用变得更大,也可以很容易地切换到MySQL或PostGreSQL。

2

别这么做,CSV格式的文件不太好。

其实有很多其他的选择,比如可以用sqlite数据库,或者用python的shelve模块等等。标准库里提供的选项可以在这里找到。

因为你的应用是个网页应用,所以你需要考虑并发的问题,以确保数据的完整性。你也可以考虑使用更强大的数据库,比如postgres,针对这个数据库有很多python库可以使用。

撰写回答