我尝试使用SQLAlchemy与dockerSQL PostgreSQL服务器进行交互。类似的东西:
engine = create_engine('postgresql://user:user_password@localhost:5432/database')
df.to_sql('table', engine)
这给了我这个错误:
OperationalError:(psycopg2.OperationalError)无法连接到服务器:连接被拒绝 服务器是否在主机上运行" localhost" (:1)并接受 端口5432上的TCP / IP连接? 无法连接到服务器:连接被拒绝 服务器是否在主机上运行" localhost" (127.0.0.1)并接受 端口5432上的TCP / IP连接?
这表明Docker postgresql(正在运行)在该端口不可用。我尝试将-p 5432:5432
添加到docker-compose exec
但没有成功。有小费吗?
答案 0 :(得分:1)
大家好!让我尝试帮助您将Flask Web App连接到都在Docker上运行的PostgreSQL数据库。
首先,您应该已经安装了以下python模块:
您应该使用 pip 安装它们。
psycopg2是将SQLAlchemy连接到PostgreSQL数据库所需的PostgreSQL驱动程序之一。
我正在向您展示我的 docker-compose.yml 文件。
version: '3'
services:
web:
#YourWebServiceConfiguration
#YourWebServiceConfiguration
#YourWebServiceConfiguration
db_postgres:
image: postgres:latest
container_name: postgres_db_container
ports:
- "5432:5432"
volumes:
- postgres_db_vol:/var/lib/postgresql/data
environment:
POSTGRES_USER: yourUserDBName
POSTGRES_PASSWORD: yourUserDBPassword
POSTGRES_DB: yourDBName
现在让我们看看我的python代码!这是一个 test.py 文件。
from sqlalchemy import create_engine
from sqlalchemy.orm import scoped_session, sessionmaker
conn_url = 'postgresql+psycopg2://yourUserDBName:yourUserDBPassword@yourDBDockerContainerName/yourDBName'
engine = create_engine(conn_url)
db = scoped_session(sessionmaker(bind=engine))
query_rows = db.execute("SELECT * FROM anyTableName").fetchall()
for register in query_rows:
print(f"{register.col_1_name}, {register.col_2_name}, ..., {register.col_n_name}")
# Note that this Python way of printing is available in Python3 or more!!
如果您想了解更多信息,可以查看以下链接。
常规数据库连接网址:
方言+驱动程序://用户名:密码@主机:端口/数据库
如果使用Docker,则需要替换docker容器名称的主机值。
答案 1 :(得分:0)
由于烧瓶应用程序和Postgres映像不在同一个Docker容器中,因此您无法通过localhost来访问数据库!
在数据库URL中的中,将 localhost 替换为Postgres URL的卷名称,并将其替换为docker compose /
中的Postgres Volume的名称。engine = create_engine('postgresql://user:user_password@{}:5432/database'.format('volume_name_of_postgres'))
答案 2 :(得分:0)
我遇到了同样的问题。经过几次尝试,发现问题出在给sqlalchemy.create_engine()
的连接URL字符串中首先我和你一样:
db_URL = f"postgresql://{db_login}:{db_password}@localhost:5432/postgres"
修复了一个:
db_URL = f"postgresql+psycopg2://{db_login}:{db_password}@db:5432/postgres"
我这边有点愚蠢的方法同时进行两次更改,但我已经检查过,看起来问题出在 localhost。将服务器地址更改为 docker_compose.yml 中所述的 container_name 应该可以解决连接问题。
db:
image: postgres:12.7-alpine
container_name: db