Проблемы с использованием sqlAlchemy для выполнения SQL-запросов в моей базе данных - PullRequest
0 голосов
/ 11 ноября 2018

Я работаю над проектом для работы на веб-сайте, который подключается к серверу mysql с использованием flask и sqlAlchemy (размещено на AWS RDS), и я следую этому учебнику , но когда я пытаюсь это сделать (/ api / bar) я получаю эту ошибку. Когда я просто делаю свой localhost: 8080, он прекрасно показывает «Hello World».

sqlalchemy.exc.OperationalError: (pymysql.err.OperationalError) (2003, «Не удается подключиться к серверу MySQL на« localhost »([WinError 10061] Невозможно установить соединение, поскольку целевая машина активно от него отказалась)» ) (Справочная информация об этой ошибке на: http://sqlalche.me/e/e3q8)

config.py database_url = "mysql + pymysql: // имя пользователя: пароль @ localhost: 3306 / barbeerdrinker"

Вот мой __ init __ .py

from flask import Flask
from flask import jsonify
from flask import make_response
from flask import request
import json

from barbeerdrinker import database

#Flask application
app = Flask(__name__)

@app.route("/")
def hello_world():
    return "Hello World"

@app.route("/api/bar", methods=["GET"])
def get_bars():
    return jsonify(database.get_bars())

@app.route("/api/bar/<name>", methods=["GETS"])
def find_bar(name):
    try:
        if name is None:
            raise ValueError("Bar is not specified")
        bar = database.find_bar(name)
        if bar is None:
            return make_response("No bar found within given name", 404)
        return jsonify(bar)
    except ValueError as e:
        return make_response(str(e), 400)
    except Exception as e:
        return make_response(str(e), 500) 

@app.route("/api/beers_cheaper_than", methods=["POST"])
def find_beers_cheaper_than():
    body = json.loads(request.data)
    max_price = body['maxPrice']
    return jsonify(database.filter_beers(max_price)) 

database.py

from sqlalchemy import create_engine
from sqlalchemy import sql

from barbeerdrinker import config

engine = create_engine(config.database_url)

def get_bars():
    with engine.connect() as con:
        rs = con.execute("SELECT name, address, city, opening, closing, phoneNum FROM bars")
        return [dict(row) for row in rs]

def find_bar(name):
    with engine.connect() as con:
        query = sql.text("SELECT * FROM bars WHERE name = :name;")
        rs = con.execute(query, name=name)
        result = rs.first()
        if result is None:
            return None
        return dict(result)

def filter_beers(max_price):
    with engine.connect() as con:
        query = sql.text("SELECT * FROM sells WHERE price < : max_price;")
        rs = con.execute(query, max_price=max_price)
        results = [dict(row) for row in rs]
        for r in results:
            r['price'] = float(r['price'])
        return results

** Редактировать: Похоже, проблема не в моем коде, а в ошибке Windows. Одно из решений, которое я попытался сделать, - открыть нужные порты через брандмауэр, но безрезультатно.

1 Ответ

0 голосов
/ 11 ноября 2018

Я только что понял, оказывается, проблема не в Windows. Проблема в моем config.py:

Вместо: database_url = "mysql+pymysql://username:password@localhost:3306/barbeerdrinker"

Должно быть: database_url = "mysql+pymysql://username:password@**AWSENDPOINT/HOSTNAME**:3306/barbeerdrinker"

...