如何控制SQLAlchemy放置sqlite db文件的位置

64jmpszr  于 2023-02-09  发布在  SQLite
关注(0)|答案(1)|浏览(205)

我计划(尝试)上传一个flask应用程序到一个不提供ssh访问的网络主机。我已经确认它(网络主机)将运行Flask应用程序,并且当它没有数据库时,我可以创建一个工作的应用程序,但是当我尝试创建数据库时,我收到错误。我不知道如何控制它试图放置数据库的位置。我的代码如下所示:

from flask_sqlalchemy import SQLAlchemy
# create the extension
db = SQLAlchemy()
# create the app
app = Flask(__name__)
# configure the SQLite database, relative to the app instance folder
app.config["SQLALCHEMY_DATABASE_URI"] = "sqlite:///flaskapp.db"

# initialize the app with the extension
db.init_app(app)

在我的开发机器上,使用Geany,运行db. create_all()将数据库放在"var/app-instance/"中,使用PyCharm,在同一台机器上将其放在" instance/"中。
某个变量可能指示了这个路径是什么,但到目前为止我还没有弄清楚是什么,或者如何影响它。我的应用程序在我的开发服务器上运行正常,使用的是任意一个开发环境(Geany或Pycharm),但在我尝试使用的Web主机上不起作用,如下所述。
除了"谷歌搜索"之外,我还浏览了sqlalchemy文件,在www.example.com中找到了def create_all(..),但找不到它从哪里获得要创建什么目录结构的信息。schema.py but can't work out where it gets the information on what directory-structure to create.
我不能在web主机中使用"os",这是在其他答案和教程中提出的建议。我试着创建各种形式的路径,在我的开发机器上,例如,这是有效的:"sqlite:///tmp/flakapp.db",但我没有访问/tmp在网络主机上,我无法找到一个绝对路径,网络主机将接受(即没有抱怨,我没有访问权写入目录).我不能'pwd'在网络主机上也.
在我的开发机器上使用"sqlite://instance/flankapp.db"会产生一个错误,指出:有效的SQLite URL格式为:

  • sqlite:///:内存:(或,sqlite://)
  • sqlite:///relative/path/to/file.db
  • sqlite:////absolute/path/to/file.db

但是,如果我尝试使用相对路径,例如"sqlite:///instance/flankapp.db",我会得到"sqlalchemy. exc. OperationalError:(sqlite3.OperationalError)无法打开数据库文件-(此错误的背景位于:https://sqlalche.me/e/20/e3q8)",即使我自己创建目录(即相对于www.example.com根目录)。[在这种情况下,写权限与项目的所有其他部分相同]。app.py root directory). [In this case write permissions are the same as for all other parts of the project].
在错误输出中,该链接显示"此错误是DBAPI错误,源自数据库驱动程序(DBAPI),而不是SQLAlchemy本身"。不幸的是,我不清楚如何处理此错误。
如果有人能帮我找到能帮助我理解和解决问题的信息,那就太好了,谢谢!
我希望能够显式地说明数据库将存储在相对于应用程序目录的路由的位置
我正在使用Linux(Arch),以防这也很重要。
下面由Sam链接的问题展示了"url. make_url()"的用法。

>>> import sqlalchemy.engine.url as url
>>> url.make_url('sqlite:///flaskcw.db')
sqlite:///flaskcw.db

这是我所期望的(也是我想要的)。但这不是我运行db. create_all()时所发生的

>>> from main import db
database binding
sqlite:///flaskcw.db
Engine(sqlite:////home/user/PycharmProjects/cwflaskapp/instance/flaskcw.db)

而我希望它将数据库放在项目的根目录中(在本例中为cwflakapp/,如..cwflakapp/flakcw.db)--假定www.example.com在那里--而不是放在'projroot'/instance/中,这是在过程中创建的目录。(或者在Geany的情况下,放在' projroot'/var/app-instance/中--也是在创建上述数据库时创建的)。main.py is - rather than in 'projroot'/instance/, a directory that is created in the process. (Or in the case of Geany in 'projroot'/var/app-instance/ - also created only on creating the database as above).
我错过了什么?

uqdfh47h

uqdfh47h1#

我发现了另一个问题this code isnt creating my site.db file in directory,它的答案允许我在开发服务器上指定一个文件夹,而不依赖于“os”。
我可以这样简单地重复答复的有关部分:

app.config['SQLALCHEMY_DATABASE_URI'] = f"sqlite:///{app.root_path}/mydir/site.db"

这会将数据库放在“projroot”/mydir/site.db中。我将确认我可以在Web主机上执行相同的操作,并将相应地重新编辑

相关问题