本地SQLAlchemy SQLite数据库上传CPanel主机能否正常使用?
解答
现有SQLite配置直接上传能不能运行?
- 小流量测试场景下能跑,但有两个硬前提:
- 运行Flask应用的进程对
database.db所在的文件夹有读写、创建临时文件的权限,上传完记得给对应目录开755权限,必要时开775,别开777避免安全问题 - 数据库文件绝对不能放在
public_html这类对外公开的web根目录,不然任何人都能直接下载你的全量数据库;也别放在系统临时目录,CPanel会定期清理临时文件,容易丢数据
- 运行Flask应用的进程对
- 但这种方式绝对不适合正式生产用:SQLite本身不支持高并发写入,只要同时有两三个请求触发写库操作,就很容易出现锁库报错,访问量稍微大一点直接崩。
要不要改代码适配CPanel提供的数据库服务?
- 正式上线必须改,CPanel标配的MySQL(或MariaDB)是生产环境更稳妥的选择,并发能力、数据可靠性、锁机制都比SQLite强几个档次,适配成本极低,根本不用改你写好的模型代码,只需要换个连接配置:
- 先在CPanel后台的「MySQL数据库」板块创建新数据库,绑定专属数据库账号,记好四个参数:数据库用户名、数据库密码、数据库主机地址(注意CPanel的数据库主机很多时候不是默认localhost,以面板显示的地址为准)、数据库名
- 安装MySQL对应的Python驱动:
pip install pymysql cryptography - 替换原来的数据库连接配置即可,参考代码:
db = SQLAlchemy() # 注释掉原有的SQLite配置 # DB_NAME = "database.db" # app.config['SQLALCHEMY_DATABASE_URI'] = f'sqlite:///{DB_NAME}' # 新增MySQL配置 DB_USER = "你在CPanel创建的数据库用户名" DB_PASSWORD = "对应数据库账号的密码" DB_HOST = "CPanel显示的数据库主机地址" DB_NAME = "你创建的数据库名称" app.config['SQLALCHEMY_DATABASE_URI'] = f'mysql+pymysql://{DB_USER}:{DB_PASSWORD}@{DB_HOST}/{DB_NAME}?charset=utf8mb4'
- 换完配置之后重新执行一次表创建/数据迁移,把原有SQLite里的数据导入新库就完成适配了。
- 如果你只是传个临时演示的小项目,总共没几个人访问,那把权限配置到位用SQLite凑合用也没问题;但凡要正式对外提供服务,一定要换主机提供的数据库服务,不然频繁锁库、丢数据都属于常见问题。
内容的提问来源于stack exchange,提问作者Georgi Petrov
相关产品推荐
相关产品推荐

