Reputation: 51
I am giving it a last try before I give up, I have googling everywhere but still havent found a solution to my error.
Just so clarify some things:
When i create docker image and run it, i get the following error:
sqlalchemy.exc.OperationalError: (MySQLdb._exceptions.OperationalError) (2002, "Can't con nect to local MySQL server through socket '/var/run/mysqld/mysqld.sock' (2)")
So here is my "main.py" file:
from flask import Flask, request
from flask_sqlalchemy import SQLAlchemy
from flask_marshmallow import Marshmallow
from flask_restful import Api, Resource
from flask_mysqldb import MySQL
app = Flask(__name__)
app.config['SQLALCHEMY_DATABASE_URI'] = 'mysql://myUser:myPassword@MyIpAdress/just_a_test'
db = SQLAlchemy(app)
ma = Marshmallow(app)
api = Api(app)
#------------------------------------------------------------------------------------------------------
class exercise(db.Model):
exerciseId = db.Column(db.Integer(), primary_key=True)
exerciseName = db.Column(db.String(50))
repetitions = db.Column(db.Integer())
timeTakenToCompleteRepetitions = db.Column(db.Integer())
class exerciseSchema(ma.SQLAlchemyAutoSchema):
class Meta:
model = exercise
exercise_schema = exerciseSchema()
exercises_schema = exerciseSchema(many=True)
class exerciseListResource(Resource):
def get(self):
exercise = exercise.query.all()
return exercises_schema.dump(exercise)
def post(self):
new_exercise = exercise(
exerciseId=request.json['exerciseId'],
exerciseName=request.json['exerciseName'],
repetitions=request.json['repetitions'],
timeTakenToCompleteRepetitions=request.json['timeTakenToCompleteRepetitions']
)
db.session.add(new_exercise)
db.session.commit()
return_data = exercise_schema.dump(new_exercise)
return return_data, 201
class exerciseResource(Resource):
def get(self, exercise_exerciseId):
exercise = exercise.query.get_or_404(exercise_exerciseId)
return exercise_schema.dump(exercise)
def patch(self, exercise_exerciseId):
exercise = exercise.query.get_or_404(exercise_exerciseId)
if request.json.get('exerciseName'):
exercise.exerciseName = request.json['exerciseName']
if request.json.get('repetitions'):
exercise.repetitions = request.json['repetitions']
if request.json.get('timeTakenToCompleteRepetitions'):
exercise.timeTakenToCompleteRepetitions = request.json['timeTakenToCompleteRepetitions']
db.session.commit()
return exercise_schema.dump(exercise)
def delete(self, exercise_exerciseId):
exercise = exercise.query.get_or_404(exercise_exerciseId)
db.session.delete(exercise)
db.session.commit()
return '', 204
api.add_resource(exerciseListResource, '/exercise')
api.add_resource(exerciseResource, '/exercise/<int:exercise_exerciseId>')
#---------------------------------------------------------------------------------------------------
if __name__ == '__main__':
app.run(debug=True)
What could the problem be?
Upvotes: 1
Views: 512
Reputation: 2198
Need to expose the Mysql port via Docker's -p
option like so:
docker run -p 3306:3306 --name mysql-server -e MYSQL_ROOT_PASSWORD=password -d mysql:latest
Also, if connecting to local, use 127.0.0.1
instead of localhost
so the connection is made via tcp instead of local socket file.
Upvotes: 1