简体   繁体   English

无法连接到“数据库”上的 MySQL 服务器([Errno 111] 连接被拒绝

[英]Can't connect to MySQL server on 'database' ([Errno 111] Connection refused

I'm trying to create a flask-mysql app and deploy it using docker.我正在尝试创建一个 flask-mysql 应用程序并使用 docker 部署它。

This is my app.py file:这是我的 app.py 文件:

import mysql.connector
from flaskext.mysql import MySQL

from flask_wtf import FlaskForm
from wtforms import StringField, SubmitField, IntegerField, PasswordField, SelectField
from wtforms.validators import DataRequired, Length, Email, ValidationError, EqualTo

from flask import Flask, render_template, url_for, flash, redirect, session
from flask_bcrypt import Bcrypt
import random
import json
import sys
import os

# ~~~~~~~~~~~ DB Connection ~~~~~~~~~~~

app = Flask(__name__)

mysql = MySQL()
app.config['MYSQL_DATABASE_USER'] = 'bharathi7401'
app.config['MYSQL_DATABASE_PASSWORD'] = 'user_pass'
app.config['MYSQL_DATABASE_DB'] = 'bus_booking'
app.config['MYSQL_DATABASE_HOST'] = 'database'


mysql.init_app(app)
conn = mysql.connect()
with open("init.sql",'r') as file1:
    sql_cmds = file1.read()

sql_cmds1 = sql_cmds.split(";")

for i in range(0,len(sql_cmds1)-1):
    query = sql_cmds1[i] + ';'
    cursor = conn.cursor()
    cursor.execute(query)
conn.commit()
  



def book_passengers(bookid):

    mycursor = conn.cursor()
    sql = "SELECT passengers FROM booking WHERE booking_id = '" + str(bookid) + "'"
    mycursor.execute(sql)
    seats = mycursor.fetchall()
    return seats[0][0]

def get_bus_seats(busid):

    mycursor = conn.cursor()
    sql = "SELECT seats FROM bus WHERE busid = '" + str(busid) + "'"
    mycursor.execute(sql)
    seats = mycursor.fetchall()
    return seats

def update_bus_passengers(busid, newpass):

    mycursor = conn.cursor()
    updtbk = "update bus set seats = seats-" + str(newpass) + " where busid = '" + str(busid) + "'"
    mycursor.execute(updtbk)
    conn.commit()

def generateid():
    
    id = random.randint(11111,99999)
    return id

def allbus(to_, from_):
    
    mycursor = conn.cursor()
    sql = "SELECT * FROM bus WHERE to_ = " + "'" + str(to_) + "'" + " AND from_ = " + "'" + from_ + "'"
    mycursor.execute(sql)

    myresult = mycursor.fetchall()
    return myresult

def busdeatils(busid):

    mycursor = conn.cursor()
    sql = "SELECT * FROM bus WHERE busid = " + "'" + str(busid) + "'"
    mycursor.execute(sql)

    myresult = mycursor.fetchall()
    return myresult

def userinsert(det):

    mycursor = conn.cursor()

    sql = "INSERT INTO user (userid, username, phone, email, bookid) VALUES (%s, %s, %s, %s, %s)"
    val = tuple(det)
    mycursor.execute(sql, val)
    conn.commit()
    return

def bookinginsert(det):

    mycursor = conn.cursor()

    sql = "INSERT INTO booking (booking_id, userid, busid, passengers) VALUES (%s, %s, %s, %s)"
    val = tuple(det)
    mycursor.execute(sql, val)

    conn.commit()
    return

def booking_details(id):

    mycursor = conn.cursor()
    sql1 = "SELECT * FROM booking WHERE booking_id = " + "'" + str(id) + "'"
    mycursor.execute(sql1)
    result1 = mycursor.fetchall()
    sql2 = "select * from user where userid in ( select userid from booking where booking_id = " + "'" + str(id) + "'" + ");"
    mycursor.execute(sql2)
    result2 = mycursor.fetchall()
    sql3 = "select * from bus where busid in ( select busid from booking where booking_id = " + "'" + str(id) + "'" + ");"
    mycursor.execute(sql3)
    result3 = mycursor.fetchall()
    return result1+result2+result3

def delete(bookid):

    try:
        det = booking_details(bookid)
        userid = det[0][1]
        mycursor = conn.cursor()

        sql1 = "delete from booking where booking_id = '" + str(bookid) + "'"
        mycursor.execute(sql1)
        conn.commit()

        sql2 = "delete from user where userid = '" + str(userid) + "'"
        mycursor.execute(sql2)

        conn.commit()
    except:
        pass
    return

    return

def updatebookingpassengers(bookid, pas):

    mycursor = conn.cursor()
    pas = pas[0]
    updtbk = "update booking set passengers = " + str(pas) + " WHERE booking_id = '" + str(bookid) + "'"
    print(updtbk)
    mycursor.execute(updtbk)
    conn.commit()

def updatebookuser(user, book, bookid):

    mycursor = conn.cursor()
    sql = "SELECT userid FROM booking WHERE booking_id = '" + str(bookid) + "'"
    mycursor.execute(sql)
    userid = mycursor.fetchall()
    userid = userid[0][0]
    pas = book
    updatebookingpassengers(bookid, pas)
    

    name, phno, email = user
    updtus = "update user set username = '" + str(name) + "',phone = '" + str(phno) + "',email = '" + str(email) + "' where userid = '" + str(userid) + "'"
    mycursor.execute(updtus)
    conn.commit()

@app.route('/', methods = ["GET", "POST"])
def index():

    if request.method=="POST":
        from12 = request.form['from']
        to12 = request.form['to']
        if from12==to12:
            return render_template('404.html')
        else:
            return redirect(f"/search/{from12}/{to12}")
    return render_template('index.html')

@app.route('/update', methods = ["GET", "POST"])
def update():

    if request.method=="POST":
        id = request.form['id']
        return redirect(f"/change/{id}")
    return render_template('update.html')

@app.route('/change/<id>')
def change(id):

    busd = booking_details(id)
    if busd == []:
        return render_template('404.html')
    return render_template('change.html', busd = busd)

@app.route('/updel/<int:bookid>', methods = ["GET", "POST"])
def updel(bookid):

    if request.method=="POST":
        req = request.form['op']
        if req=="update":
            busd = booking_details(bookid)
            seat = busd[2][7]
            
            seats = [i for i in range(1,seat+1)]
            return render_template("updatebooking.html", busd = busd, seats = seats)
        else:
            busd = booking_details(bookid)
            busid = busd[0][2]
            passengers = book_passengers(bookid)
            update_bus_passengers(busid, -passengers)
            delete(bookid)
            return render_template("deleted.html")

@app.route('/updatebook/<int:bookid>', methods = ["GET", "POST"])
def updatebook(bookid):
    
    if request.method=="POST":
        name = request.form['name']
        phno = request.form['phno']
        email = request.form['email']
        passengers = request.form['passengers']

        user_new_details = [name, phno, email]
        booking_new_details = [passengers]
        busd = booking_details(bookid)
        busid = busd[0][2]
        oldpassengers = book_passengers(bookid)
        updatebookuser(user_new_details, booking_new_details, bookid)
        
        new_passengers = int(passengers)-oldpassengers
        print(new_passengers)
        update_bus_passengers(busid, new_passengers)

    return render_template("updated.html")


@app.route('/search/<from12>/<to12>')
def search(from12, to12):

    details = allbus(to12, from12)
    return render_template('search.html', det = details)

@app.route('/book/<int:busid>')
def book(busid):

    busd = busdeatils(busid)
    print(busd, file=sys.stderr)
    seat = busd[0][7]
    seats = [i for i in range(1,seat+1)]
    return render_template('book.html', busd = busd, seats = seats)


@app.route('/booked/<int:busid>', methods = ["GET", "POST"])
def booked(busid):

    if request.method=="POST":
        name = request.form['name']
        phno = request.form['phno']
        email = request.form['email']
        passengers = request.form['passengers']

        userid = generateid()
        bookingid = generateid()

        update_bus_passengers(busid, passengers)
        user_details = [userid, name, phno, email, bookingid]
        booking_details = [bookingid, userid, busid ,passengers]
        userinsert(user_details)
        bookinginsert(booking_details)
    return render_template('booked.html', id=bookingid)


if __name__ == '__main__':
    app.debug = True
    app.run(host ='0.0.0.0', port=5000)

When I do docker-compose up to run the app, I get the below error:当我执行docker-compose up来运行应用程序时,出现以下错误:

* Environment: production
bus-ticket-booking-app-1       |    WARNING: This is a development server. Do not use it in a production deployment.
bus-ticket-booking-app-1       |    Use a production WSGI server instead.
bus-ticket-booking-app-1       |  * Debug mode: off
bus-ticket-booking-app-1       | Traceback (most recent call last):
bus-ticket-booking-app-1       |   File "/usr/local/lib/python3.10/site-packages/pymysql/connections.py", line 613, in connect
bus-ticket-booking-app-1       |     sock = socket.create_connection(
bus-ticket-booking-app-1       |   File "/usr/local/lib/python3.10/socket.py", line 845, in create_connection
bus-ticket-booking-app-1       |     raise err
bus-ticket-booking-app-1       |   File "/usr/local/lib/python3.10/socket.py", line 833, in create_connection
bus-ticket-booking-app-1       |     sock.connect(sa)
bus-ticket-booking-app-1       | ConnectionRefusedError: [Errno 111] Connection refused
bus-ticket-booking-app-1       | 
bus-ticket-booking-app-1       | During handling of the above exception, another exception occurred:
bus-ticket-booking-app-1       | 
bus-ticket-booking-app-1       | Traceback (most recent call last):
bus-ticket-booking-app-1       |   File "/usr/local/lib/python3.10/runpy.py", line 196, in _run_module_as_main
bus-ticket-booking-app-1       |     return _run_code(code, main_globals, None,
bus-ticket-booking-app-1       |   File "/usr/local/lib/python3.10/runpy.py", line 86, in _run_code
bus-ticket-booking-app-1       |     exec(code, run_globals)
bus-ticket-booking-app-1       |   File "/usr/local/lib/python3.10/site-packages/flask/__main__.py", line 3, in <module>
bus-ticket-booking-app-1       |     main()
bus-ticket-booking-app-1       |   File "/usr/local/lib/python3.10/site-packages/flask/cli.py", line 995, in main
bus-ticket-booking-app-1       |     cli.main(args=sys.argv[1:])
bus-ticket-booking-app-1       |   File "/usr/local/lib/python3.10/site-packages/flask/cli.py", line 601, in main
bus-ticket-booking-app-1       |     return super().main(*args, **kwargs)
bus-ticket-booking-app-1       |   File "/usr/local/lib/python3.10/site-packages/click/core.py", line 1053, in main
bus-ticket-booking-app-1       |     rv = self.invoke(ctx)
bus-ticket-booking-app-1       |   File "/usr/local/lib/python3.10/site-packages/click/core.py", line 1659, in invoke
bus-ticket-booking-app-1       |     return _process_result(sub_ctx.command.invoke(sub_ctx))
bus-ticket-booking-app-1       |   File "/usr/local/lib/python3.10/site-packages/click/core.py", line 1395, in invoke
bus-ticket-booking-app-1       |     return ctx.invoke(self.callback, **ctx.params)
bus-ticket-booking-app-1       |   File "/usr/local/lib/python3.10/site-packages/click/core.py", line 754, in invoke
bus-ticket-booking-app-1       |     return __callback(*args, **kwargs)
bus-ticket-booking-app-1       |   File "/usr/local/lib/python3.10/site-packages/click/decorators.py", line 84, in new_func
bus-ticket-booking-app-1       |     return ctx.invoke(f, obj, *args, **kwargs)
bus-ticket-booking-app-1       |   File "/usr/local/lib/python3.10/site-packages/click/core.py", line 754, in invoke
bus-ticket-booking-app-1       |     return __callback(*args, **kwargs)
bus-ticket-booking-app-1       |   File "/usr/local/lib/python3.10/site-packages/flask/cli.py", line 850, in run_command
bus-ticket-booking-app-1       |     app = DispatchingApp(info.load_app, use_eager_loading=eager_loading)
bus-ticket-booking-app-1       |   File "/usr/local/lib/python3.10/site-packages/flask/cli.py", line 325, in __init__
bus-ticket-booking-app-1       |     self._load_unlocked()
bus-ticket-booking-app-1       |   File "/usr/local/lib/python3.10/site-packages/flask/cli.py", line 351, in _load_unlocked
bus-ticket-booking-app-1       |     self._app = rv = self.loader()
bus-ticket-booking-app-1       |   File "/usr/local/lib/python3.10/site-packages/flask/cli.py", line 411, in load_app
bus-ticket-booking-app-1       |     app = locate_app(self, import_name, None, raise_if_not_found=False)
bus-ticket-booking-app-1       |   File "/usr/local/lib/python3.10/site-packages/flask/cli.py", line 260, in locate_app
bus-ticket-booking-app-1       |     __import__(module_name)
bus-ticket-booking-app-1       |   File "/app.py", line 27, in <module>
bus-ticket-booking-app-1       |     conn = mysql.connect()
bus-ticket-booking-app-1       |   File "/usr/local/lib/python3.10/site-packages/flaskext/mysql.py", line 65, in connect
bus-ticket-booking-app-1       |     return pymysql.connect(**self.connect_args)
bus-ticket-booking-app-1       |   File "/usr/local/lib/python3.10/site-packages/pymysql/connections.py", line 353, in __init__
bus-ticket-booking-app-1       |     self.connect()
bus-ticket-booking-app-1       |   File "/usr/local/lib/python3.10/site-packages/pymysql/connections.py", line 664, in connect
bus-ticket-booking-app-1       |     raise exc
bus-ticket-booking-app-1       | pymysql.err.OperationalError: (2003, "Can't connect to MySQL server on 'database' ([Errno 111] Connection refused)")
bus-ticket-booking-app-1 exited with code 1

I am using a docker-compose.yml file to create the database with the given credentials.我正在使用 docker-compose.yml 文件创建具有给定凭据的数据库。


version: '2'
services:
  app:
    image: bharathi7401/bus-booking
    build: .
    depends_on:
      -  database
    ports:
      - "5000:5000"

  database:
    platform: linux/amd64
    image: mysql:5.7
    environment:
      MYSQL_ROOT_PASSWORD: Root@123
      MYSQL_USER: bharathi7401
      MYSQL_PASSWORD: user_pass
      MYSQL_DATABASE: bus_booking
    ports:
      - "3306:3306"

Can someone tell me whats causing this error?有人可以告诉我是什么导致了这个错误吗? How do I get rid of it?我该如何摆脱它?

It looks like you are reaching the database but it is refusing to grant you entry.看起来您正在访问数据库,但它拒绝授予您进入权限。 This restriction might be due to user permissions or sql's.network permissions.此限制可能是由于用户权限或 sql 的.network 权限。 Check your logs at /var/log/mysql and see if you can find out why the connection is being refused./var/log/mysql检查你的日志,看看你是否能找出连接被拒绝的原因。 If logging is not enabled, you will have to enable logs then try to connect again.如果未启用日志记录,您将必须启用日志然后再次尝试连接。 Also, make sure the SQL user has permission to connect either locally or from the remote address.此外,请确保 SQL 用户有权在本地或从远程地址进行连接。 In the MySQL shell you can check user permissions with Select user, host from mysql.user;在 MySQL shell 中,您可以使用Select user, host from mysql.user;

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

相关问题 PyMySQL:- OperationalError: (2003, “无法连接到‘本地主机’上的 MySQL 服务器([Errno 111] 连接被拒绝)”) - PyMySQL:- OperationalError: (2003, "Can't connect to MySQL server on 'localhost' ([Errno 111] Connection refused)") 无法理解[Errno 111]连接被拒绝 - can't understand [Errno 111] Connection refused Mysql([Errno 111] 连接被拒绝)”) - Mysql ([Errno 111] Connection refused)") Docker MYSQL [2003] 无法连接到 MySQL 服务器(111 连接被拒绝) - Docker MYSQL [2003] Can't connect to MySQL server (111 Connection refused) mysql.connector.errors.InterfaceError:2003:无法连接到“127.0.0.1:3306”上的 MySQL 服务器(111 连接被拒绝) - mysql.connector.errors.InterfaceError: 2003: Can't connect to MySQL server on '127.0.0.1:3306' (111 Connection refused) Mariadb docker容器无法使用Python连接到主机上的MySQL服务器(111连接被拒绝) - Mariadb docker container Can't connect to MySQL server on host (111 Connection refused) with Python 2003:无法连接到“192.168.0.14:3306”上的 MySQL 服务器(111 连接被拒绝) - 2003: Can't connect to MySQL server on '192.168.0.14:3306' (111 Connection refused) mongoengine.connection.ConnectionError:无法连接到数据库默认值:[Errno 111]连接被拒绝 - mongoengine.connection.ConnectionError: Cannot connect to database default : [Errno 111] Connection refused ConnectionRefusedError:[Errno 111]连接被拒绝 - ConnectionRefusedError: [Errno 111] Connection refused GraphQL:[Errno 111] 连接被拒绝 - GraphQL: [Errno 111] Connection refused
 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM