OperationalError:在Google Cloud应用程序上尝试写入只读数据库
在Google Cloud Application中出现"OperationalError: Attempt to Write A ReadOnly Database"的问题是因为App Engine具有只读文件系统,也就是说无法修改文件。然而,它有一个/tmp/文件夹用于存储临时文件,正如其名称所示。实际上,它使用的是RAM,所以如果数据库很大的话,这不是一个好主意。
在应用程序启动时,您可以将原始数据库文件复制到/tmp/文件夹并从那里使用它。
这个方法是有效的。然而,当应用节点缩小到0时,数据库中的所有更改都会丢失。应用的每个节点都有自己的数据库副本,并且数据在节点之间不共享。如果您需要在应用节点之间共享数据,最好使用CloudSQL。
# 复制数据库文件到/tmp/文件夹 import shutil shutil.copy2('/path/to/original/database.db', '/tmp/database.db')
# 连接数据库 import sqlite3 conn = sqlite3.connect('/tmp/database.db')
解决方法是将数据库文件复制到/tmp/文件夹,并通过连接/tmp/文件夹中的数据库文件来访问数据。这样可以在App Engine启动时保留数据库的更改。但请注意,当应用节点缩小到0时,所有更改都将丢失。如果需要在应用节点之间共享数据并保持更改,最好使用CloudSQL。
在Google Cloud应用程序中遇到OperationalError: Attempt to Write A ReadOnly Database问题的解决方法是尝试更改目录的权限,并检查.sqllite文件是否存在且可写。但通常情况下,在应用引擎上使用磁盘数据是不明智的,因为磁盘存储是临时的(除非您正在使用弹性环境上的持久磁盘),但即使如此,最好使用云数据库解决方案。
解决方法如下:
1. 尝试更改目录的权限,确保应用程序有写入权限。
2. 检查.sqllite文件是否存在,并确保应用程序有写入权限。
3. 不建议在应用引擎上依赖磁盘数据,因为磁盘存储是临时的。如果需要持久性数据存储,可以考虑使用弹性环境上的持久磁盘。
4. 更好的解决方案是使用云数据库解决方案,如Google Cloud的存储服务。这样可以确保数据的持久性和可靠性。
参考链接:
- [Stack Overflow: Python SQLite3 OperationalError: Attempt to Write A ReadOnly Database](https://stackoverflow.com/questions/40703228)
- [GitHub Issue: iPython OperationalError: Attempt to Write A ReadOnly Database](https://github.com/ipython/ipython/issues/4753)
- [Stack Overflow: Flask SQLAlchemy Google App Engine No Permission to Write](https://stackoverflow.com/questions/62011326)
- [Google Cloud: Pricing - Flexible Environment](https://cloud.google.com/appengine/pricing#flexible-environment-pricing)
- [Google Cloud: App Engine Storage Services](https://cloud.google.com/appengine/docs/standard/java/storage#gcp-storage-services)