【问题标题】:How to connect docker volume 'database/app.db' to SQLAlchemy?如何将 docker volume 'database/app.db' 连接到 SQLAlchemy?
【发布时间】:2020-07-21 04:46:07
【问题描述】:

我正在使用 Python 3.8.1 Flask latest 并且应用程序运行良好,但无法从 SQLAlchemy 连接 docker 卷,如果数据库不存在,它应该创建数据库,但我无法将我的共享 docker 卷连接到我的Python Flask应用程序。

Config.py 文件:

import os
basedir = os.path.abspath(os.path.dirname(__file__))

DATA_PATH = "/database"

if os.path.exists(DATA_PATH) == False:
    os.mkdir(DATA_PATH)

class Config(object):

    # set a proper secret key here or is the .flaskenv file
    SECRET_KEY = os.environ.get('SECRET_KEY') or 'you-will-never-guess'
    SQLALCHEMY_DATABASE_URI = 'sqlite://database/app.db'
    SQLALCHEMY_TRACK_MODIFICATIONS = False

init.py 文件:

from flask import Flask
from config import Config
from flask_sqlalchemy import SQLAlchemy
from flask_migrate import Migrate
from flask_login import LoginManager

app = Flask(__name__, static_url_path='', static_folder='static')
app.config.from_object(Config)
db = SQLAlchemy(app)
migrate = Migrate(app, db)
login = LoginManager(app)
login.login_view = 'login'

from app import routes, models

Docker 运行:

docker run -p 8080:8080 -it --name abc -v localdb:/database  --rm abc:v1

错误 1:

xc.ArgumentError(
sqlalchemy.exc.ArgumentError: Invalid SQLite URL: 
sqlite://database//app/app/app.db
Valid SQLite URL forms are:
 sqlite:///:memory: (or, sqlite://)
 sqlite:///relative/path/to/file.db
 sqlite:////absolute/path/to/file.db

错误 2:

对于SQLALCHEMY_DATABASE_URI = 'sqlite:///database/app.db'

sqlalchemy.exc.OperationalError: (sqlite3.OperationalError) unable to open database file
(Background on this error at: http://sqlalche.me/e/e3q8)

【问题讨论】:

    标签: python docker sqlalchemy flask-sqlalchemy docker-volume


    【解决方案1】:

    这看起来不像是 Docker 卷问题,看起来您正在尝试使用路径作为 URI 而不是:sqlite:////path/to/db.db

    见:https://docs.sqlalchemy.org/en/13/core/engines.html#database-urls

    sqlite 专用:https://docs.sqlalchemy.org/en/13/core/engines.html#sqlite

    【讨论】:

    • 我试过这样:sqlite:////database/app.db,其中数据库是指向 docker 卷的容器目录。但收到此错误:AttributeError: 'NoneType' object has no attribute 'drivername'
    猜你喜欢
    • 2021-03-12
    • 2020-08-20
    • 2018-03-04
    • 1970-01-01
    • 2012-03-03
    • 2020-03-12
    • 1970-01-01
    • 2021-12-08
    • 2019-01-12
    相关资源
    最近更新 更多