首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >ValueError:端口应该是int类型

ValueError:端口应该是int类型
EN

Stack Overflow用户
提问于 2022-03-23 02:38:03
回答 1查看 397关注 0票数 -1

我一直试图用连接我的FastAPI服务器和MySQL数据库.但是,当我运行ValueError: port should be of type int时,它一直显示错误( docker-compose up --build )。

我附上了一份完整的错误日志。这个错误似乎来自connectionstring of MySQL (我正在附加我的db.config文件)。

您能帮我一下吗?我需要做哪些更改才能使用MySQL和FastAPI服务器使用?

下面是我的docker-compose.yml文件

代码语言:javascript
运行
复制
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

我的数据库配置文件如下:

代码语言:javascript
运行
复制
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服务器的停靠文件

代码语言:javascript
运行
复制
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"]

终端上的错误登录如下:

代码语言:javascript
运行
复制
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
EN

回答 1

Stack Overflow用户

发布于 2022-03-23 11:04:17

SQLAlchemy (至少现在)希望端口位于主机名之后:

代码语言:javascript
运行
复制
connect_string = f'mysql+pymysql://{DB_USER}:{DB_PASSWORD}@{DB_HOST}:{DB_PORT}/{DB_DATABASE}?charset=utf8'

它使用f-字符串,以使其更易读,更不容易出错(因为{}.format的使用要求您跟踪序列)。这只适用于Python,所以如果您使用的是旧版本,请重写它以使用旧的格式语法。

我还建议使用utf8mb4作为字符集,以避免扩展utf8字符(如表情符号等)的问题,并应用排序规则(如果有必要):

代码语言:javascript
运行
复制
?charset=utf8mb4&collation=utf8mb4_<language>_ci
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/71581211

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档