【问题标题】:Problems using sqlAlchemy to execute SQL queries on my database使用 sqlAlchemy 在我的数据库上执行 SQL 查询的问题
【发布时间】:2018-11-10 21:51:54
【问题描述】:

我正在做一个项目,在一个网站上工作,该网站使用flask和sqlAlchemy(托管在AWS RDS上)连接到mysql服务器,我正在关注tutorial但是当我尝试做(/api/bar)我得到这个错误。当我只是做我的 localhost:8080 时,它显示“Hello World”非常好。

sqlalchemy.exc.OperationalError: (pymysql.err.OperationalError) (2003, "Can't connect to MySQL server on 'localhost' ([WinError 10061] No connection could be made because the target machine positively denied it)" )(此错误的背景:http://sqlalche.me/e/e3q8

config.py database_url = "mysql+pymysql://username:password@localhost:3306/barbeerrinker"

这是我的 __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)) 

数据库.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 错误。我尝试做的一种解决方案是通过我的防火墙打开所需的端口,但无济于事。

【问题讨论】:

  • 此代码均不相关。听起来 Windows 被配置为拒绝该端口上的请求。
  • 我尝试在防火墙中打开这些端口,但无济于事
  • 这都是本地的还是数据库托管的?
  • 数据库托管在 AWS RDS 服务器上
  • 啊哈哈,我刚刚发现barbeerdrinker。我在这方面的知识不足以帮助你,对不起,但我 99.99% 确定这与 python 无关,这是一个 Windows 问题

标签: python mysql flask sqlalchemy amazon-rds


【解决方案1】:

我只是想通了,原来问题不是 Windows 问题。问题出在我的config.py

而不是: database_url = "mysql+pymysql://username:password@localhost:3306/barbeerdrinker"

应该是: database_url = "mysql+pymysql://username:password@**AWSENDPOINT/HOSTNAME**:3306/barbeerdrinker"

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-08-08
    • 1970-01-01
    • 2018-09-08
    • 2014-12-22
    • 2017-05-13
    相关资源
    最近更新 更多