jadadad
jadadad

Reputation: 51

Error connecting to MySql database with SQLalchemy

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

Answers (1)

jcragun
jcragun

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

Related Questions