我正在尝试将我的 python 更改迁移到我的 docker 项目,但是当我尝试运行命令
python manage.py db migrate
时,我收到错误 unknown database 'main'
,但是当我查看 docker-compose.yml 文件内部时,我看到 main确实是在容器数据库的 MYSQL_DATABASE
变量内部定义的。我尝试了在 StackOverflow 和 Github 上找到的一些解决方案,例如从 docker-compose.yml 脚本中获取 restart: always
并制作一个 Windows PowerShell 脚本,该脚本将运行以重新启动我的 docker 容器,如下所示:MYSQL Docker 容器给出“未知数据库”错误,并尝试更改我的 DATA_SAVE_PATH
变量和 docker-compose.yml 中的其他此类变量:https://github.com/laradock/laradock/issues/1017 我也尝试过将 MYSQL_DATABASE
变量更改为不同的名称,但这也不起作用。
这是我运行代码时收到的完整错误:
sqlalchemy.exc.OperationalError: (MySQLdb._exceptions.OperationalError) (1049, "Unknown database 'main'")
(Background on this error at: http://sqlalche.me/e/13/e3q8)
这是我的
docker-compose.yml
脚本:
version: '3.9'
services:
backend:
build:
context: .
dockerfile: Dockerfile
ports:
- 8001:5000
volumes:
- .:/app
depends_on:
- db
db:
image: mysql:5.7.22
restart: always
environment:
MYSQL_DATABASE: main
MYSQL_USER: root
MYSQL_PASSWORD: root
MYSQL_ROOT_PASSWORD: root
volumes:
- .dbdata:/var/lib/mysql
ports:
- 33067:3306
这是我的 Dockerfile:
FROM python:3.9
ENV PYTHONUNBUFFERED 1
WORKDIR /app
COPY requirements.txt /app/requirements.txt
RUN pip install -r requirements.txt
COPY . /app
CMD python main.py
这是我的
main.py
文件:
from flask_cors import CORS
from sqlalchemy import UniqueConstraint
from vegaaimain.vegamain import main
from flask import Flask
from flask_sqlalchemy import SQLAlchemy
app = Flask(__name__)
app.config["SQLALCHEMY_DATABASE_URI"] = 'mysql://root:root@db/main'
CORS(app)
db = SQLAlchemy(app)
class VegaScriptRun(db.Model):
id = db.Column(db.Integer, primary_key=True, autoincrement=False)
title = db.Column(db.String(200))
description = db.Column(db.String(400))
image = db.Column(db.String(200))
main()
class VegaScriptUser(db.Model):
id = db.Column(db.Integer, primary_key=True)
user_id = db.Column(db.Integer)
title = db.Column(db.String(200))
description = db.Column(db.String(400))
image = db.Column(db.String(200))
UniqueConstraint('user_id', 'title', 'description', 'image', name='user_experiment_unique')
@app.route('/')
def index():
return 'Hello'
if __name__ == '__main__':
app.run(debug=True, host='0.0.0.0')
最后是我的
manage.py
文件和 requirements.txt
文件:
from main import app, db
from flask_migrate import Migrate, MigrateCommand
from flask_script import Manager
migrate = Migrate(app, db)
manager = Manager(app)
manager.add_command('db', MigrateCommand)
if __name__ == '__main__':
manager.run()
需求.txt
Flask==1.1.2
Flask-SQLAlchemy==2.4.4
SQLAlchemy==1.3.20
Flask-Migrate==3.0.0
Flask-Script==2.0.6
Flask-Cors==3.0.9
requests==2.25.0
mysqlclient==2.0.1
pika==1.1.0
wolframalpha==5.0.0
我到底错过了什么或做错了什么,谢谢!
我通过查看 .dbdata 文件夹并找到我的服务解决了这个问题,然后我将
MYSQL_DATABASE
变量和应用程序配置更改为与 MYSQL_DATABASE
相同的变量,即 vegatest
而不是 main
。
所以我运行了相同的命令
python manager.py db migrate
并且我成功迁移了。
检查数据库名称或数据库的静态路径