我一直试图用连接我的FastAPI服务器和MySQL数据库.但是,当我运行ValueError: port should be of type int
时,它一直显示错误( docker-compose up --build
)。
我附上了一份完整的错误日志。这个错误似乎来自connectionstring
of MySQL (我正在附加我的db.config
文件)。
您能帮我一下吗?我需要做哪些更改才能使用MySQL和FastAPI服务器使用?
下面是我的docker-compose.yml文件
version: '3.8'
services:
mysql-db:
container_name: mysql-db
image: mysql:latest
platform: linux/amd64
environment:
- MYSQL_DATABASE='admin'
- MYSQL_ROOT_PASSWORD='admin'
expose:
- "3306"
ports:
- "3306:3306"
backend-server:
container_name: "backend-server"
build: .
ports:
- "8000:8000"
depends_on:
- mysql-db
我的数据库配置文件如下:
from sqlalchemy import create_engine, MetaData
DB_USER = "root"
DB_PASSWORD = "admin"
DB_HOST = "localhost"
DB_PORT = 3306
DATABASE = "admin"
connect_string = 'mysql+pymysql://{}:{}@{}/{}?port={}?charset=utf8'.format(DB_USER, DB_PASSWORD, DB_HOST, DATABASE, DB_PORT)
engine = create_engine(connect_string)
meta = MetaData()
conn = engine.connect()
我的FastAPI服务器的停靠文件
FROM python:3.9
WORKDIR '/backend'
COPY ./requirements.txt ./
RUN pip install --trusted-host pypi.python.org -r requirements.txt
COPY . .
CMD ["uvicorn", "main:app"]
终端上的错误登录如下:
Creating mysql-db ... done
Creating backend-server ... done
Attaching to mysql-db, backend-server
mysql-db | 2022-03-23 02:25:55+00:00 [Note] [Entrypoint]: Entrypoint script for MySQL Server 8.0.28-1debian10 started.
backend-server | Traceback (most recent call last):
backend-server | File "/usr/local/bin/uvicorn", line 8, in <module>
backend-server | sys.exit(main())
backend-server | File "/usr/local/lib/python3.9/site-packages/click/core.py", line 1128, in __call__
backend-server | return self.main(*args, **kwargs)
backend-server | File "/usr/local/lib/python3.9/site-packages/click/core.py", line 1053, in main
backend-server | rv = self.invoke(ctx)
backend-server | File "/usr/local/lib/python3.9/site-packages/click/core.py", line 1395, in invoke
backend-server | return ctx.invoke(self.callback, **ctx.params)
backend-server | File "/usr/local/lib/python3.9/site-packages/click/core.py", line 754, in invoke
backend-server | return __callback(*args, **kwargs)
backend-server | File "/usr/local/lib/python3.9/site-packages/uvicorn/main.py", line 437, in main
backend-server | run(app, **kwargs)
backend-server | File "/usr/local/lib/python3.9/site-packages/uvicorn/main.py", line 463, in run
backend-server | server.run()
backend-server | File "/usr/local/lib/python3.9/site-packages/uvicorn/server.py", line 60, in run
backend-server | return asyncio.run(self.serve(sockets=sockets))
backend-server | File "/usr/local/lib/python3.9/asyncio/runners.py", line 44, in run
backend-server | return loop.run_until_complete(main)
backend-server | File "/usr/local/lib/python3.9/asyncio/base_events.py", line 647, in run_until_complete
backend-server | return future.result()
backend-server | File "/usr/local/lib/python3.9/site-packages/uvicorn/server.py", line 67, in serve
backend-server | config.load()
backend-server | File "/usr/local/lib/python3.9/site-packages/uvicorn/config.py", line 458, in load
backend-server | self.loaded_app = import_from_string(self.app)
backend-server | File "/usr/local/lib/python3.9/site-packages/uvicorn/importer.py", line 21, in import_from_string
backend-server | module = importlib.import_module(module_str)
backend-server | File "/usr/local/lib/python3.9/importlib/__init__.py", line 127, in import_module
backend-server | return _bootstrap._gcd_import(name[level:], package, level)
backend-server | File "<frozen importlib._bootstrap>", line 1030, in _gcd_import
backend-server | File "<frozen importlib._bootstrap>", line 1007, in _find_and_load
backend-server | File "<frozen importlib._bootstrap>", line 986, in _find_and_load_unlocked
backend-server | File "<frozen importlib._bootstrap>", line 680, in _load_unlocked
backend-server | File "<frozen importlib._bootstrap_external>", line 850, in exec_module
backend-server | File "<frozen importlib._bootstrap>", line 228, in _call_with_frames_removed
backend-server | File "/backend/./main.py", line 4, in <module>
backend-server | from routes.planner import planner
backend-server | File "/backend/./routes/planner.py", line 2, in <module>
backend-server | from config.db import conn
backend-server | File "/backend/./config/db.py", line 16, in <module>
backend-server | conn = engine.connect()
backend-server | File "/usr/local/lib/python3.9/site-packages/sqlalchemy/engine/base.py", line 3210, in connect
backend-server | return self._connection_cls(self, close_with_result=close_with_result)
backend-server | File "/usr/local/lib/python3.9/site-packages/sqlalchemy/engine/base.py", line 96, in __init__
backend-server | else engine.raw_connection()
backend-server | File "/usr/local/lib/python3.9/site-packages/sqlalchemy/engine/base.py", line 3289, in raw_connection
backend-server | return self._wrap_pool_connect(self.pool.connect, _connection)
backend-server | File "/usr/local/lib/python3.9/site-packages/sqlalchemy/engine/base.py", line 3256, in _wrap_pool_connect
backend-server | return fn()
backend-server | File "/usr/local/lib/python3.9/site-packages/sqlalchemy/pool/base.py", line 310, in connect
backend-server | return _ConnectionFairy._checkout(self)
backend-server | File "/usr/local/lib/python3.9/site-packages/sqlalchemy/pool/base.py", line 868, in _checkout
backend-server | fairy = _ConnectionRecord.checkout(pool)
backend-server | File "/usr/local/lib/python3.9/site-packages/sqlalchemy/pool/base.py", line 476, in checkout
backend-server | rec = pool._do_get()
backend-server | File "/usr/local/lib/python3.9/site-packages/sqlalchemy/pool/impl.py", line 146, in _do_get
backend-server | self._dec_overflow()
backend-server | File "/usr/local/lib/python3.9/site-packages/sqlalchemy/util/langhelpers.py", line 70, in __exit__
backend-server | compat.raise_(
backend-server | File "/usr/local/lib/python3.9/site-packages/sqlalchemy/util/compat.py", line 207, in raise_
backend-server | raise exception
backend-server | File "/usr/local/lib/python3.9/site-packages/sqlalchemy/pool/impl.py", line 143, in _do_get
backend-server | return self._create_connection()
backend-server | File "/usr/local/lib/python3.9/site-packages/sqlalchemy/pool/base.py", line 256, in _create_connection
backend-server | return _ConnectionRecord(self)
backend-server | File "/usr/local/lib/python3.9/site-packages/sqlalchemy/pool/base.py", line 371, in __init__
backend-server | self.__connect()
backend-server | File "/usr/local/lib/python3.9/site-packages/sqlalchemy/pool/base.py", line 666, in __connect
backend-server | pool.logger.debug("Error on connect(): %s", e)
backend-server | File "/usr/local/lib/python3.9/site-packages/sqlalchemy/util/langhelpers.py", line 70, in __exit__
backend-server | compat.raise_(
backend-server | File "/usr/local/lib/python3.9/site-packages/sqlalchemy/util/compat.py", line 207, in raise_
backend-server | raise exception
backend-server | File "/usr/local/lib/python3.9/site-packages/sqlalchemy/pool/base.py", line 661, in __connect
backend-server | self.dbapi_connection = connection = pool._invoke_creator(self)
backend-server | File "/usr/local/lib/python3.9/site-packages/sqlalchemy/engine/create.py", line 590, in connect
backend-server | return dialect.connect(*cargs, **cparams)
backend-server | File "/usr/local/lib/python3.9/site-packages/sqlalchemy/engine/default.py", line 597, in connect
backend-server | return self.dbapi.connect(*cargs, **cparams)
backend-server | File "/usr/local/lib/python3.9/site-packages/pymysql/connections.py", line 290, in __init__
backend-server | raise ValueError("port should be of type int")
backend-server | ValueError: port should be of type int
mysql-db | 2022-03-23 02:25:56+00:00 [Note] [Entrypoint]: Switching to dedicated user 'mysql'
backend-server exited with code 1
发布于 2022-03-23 11:04:17
SQLAlchemy (至少现在)希望端口位于主机名之后:
connect_string = f'mysql+pymysql://{DB_USER}:{DB_PASSWORD}@{DB_HOST}:{DB_PORT}/{DB_DATABASE}?charset=utf8'
它使用f-字符串,以使其更易读,更不容易出错(因为{}
和.format
的使用要求您跟踪序列)。这只适用于Python,所以如果您使用的是旧版本,请重写它以使用旧的格式语法。
我还建议使用utf8mb4
作为字符集,以避免扩展utf8字符(如表情符号等)的问题,并应用排序规则(如果有必要):
?charset=utf8mb4&collation=utf8mb4_<language>_ci
https://stackoverflow.com/questions/71581211
复制相似问题