使用 sqlAlchemy 在我的数据库上执行 SQL 查询时出现问题
Problems using sqlAlchemy to execute SQL queries on my database
我正在做一个项目,在一个网站上工作,该网站使用 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 actively refused it)") (Background on this error at: http://sqlalche.me/e/e3q8)
config.py
database_url = "mysql+pymysql://username:password@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 错误。我尝试做的一种解决方案是通过我的防火墙打开所需的端口但无济于事。
我刚刚弄明白了,原来这个问题不是 windows 的问题。问题出在我的 config.py
:
而不是:
database_url = "mysql+pymysql://username:password@localhost:3306/barbeerdrinker"
应该是:
database_url = "mysql+pymysql://username:password@**AWSENDPOINT/HOSTNAME**:3306/barbeerdrinker"
我正在做一个项目,在一个网站上工作,该网站使用 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 actively refused it)") (Background on this error at: http://sqlalche.me/e/e3q8)
config.py database_url = "mysql+pymysql://username:password@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 错误。我尝试做的一种解决方案是通过我的防火墙打开所需的端口但无济于事。
我刚刚弄明白了,原来这个问题不是 windows 的问题。问题出在我的 config.py
:
而不是:
database_url = "mysql+pymysql://username:password@localhost:3306/barbeerdrinker"
应该是:
database_url = "mysql+pymysql://username:password@**AWSENDPOINT/HOSTNAME**:3306/barbeerdrinker"