Home > Enterprise >  MySQLInterfaceError when commiting in SQLAlchemy
MySQLInterfaceError when commiting in SQLAlchemy

Time:11-17

I'm building a web API with Flask with SQLAlchemy to push data to a MySQL database. Whenever I add an object 'Project' to the session and commit it, I get the following error:

result[key] = self._cmysql.convert_to_mysql(value)[0] _mysql_connector.MySQLInterfaceError: Python type tuple cannot be converted

The class that I'm attempting to commit:

class Project(Base):
__tablename__ = 'project'

id = Column(Integer, primary_key=True, autoincrement=True)
title = Column(String(255), unique=True, nullable=False)
client = Column(String(255), unique=False, nullable=False)
work_week = Column(Integer, unique=False, nullable=False)
start_date = Column(Date, unique=False, nullable=False)
end_date = Column(Date, unique=False, nullable=True)
description = Column(String(255), unique=False, nullable=True)

def __init__(self, title, client, work_week, start_date, end_date, description):
    self.title = title
    self.client = client
    self.work_week = work_week
    self.start_date = start_date,
    self.end_date = end_date,
    self.description = description

The MarshMallow Schema for (de)serializing the above class:

class ProjectSchema(Schema):
   id = fields.Integer()
   title = fields.Str()
   client = fields.Str()
   work_week = fields.Integer()
   start_date = fields.Date()
   end_date = fields.Date()
   description = fields.Str()

And finally the method that generates the error with values at runtime:

def post_project(project: str): '{"title":"Project X","client":"Klant X","work_week":40,"start_date":"2021-11-08","end_date":"2021-11-15","description":"Dit is een voorbeeld."}'
schema = ProjectSchema() schema: <ProjectSchema(many=False)>
project_data = schema.loads(project) {'end_date': datetime.date(2021, 11, 15), 'start_date': datetime.date(2021, 11, 8), 'description': 'Dit is een voorbeeld.', 'title': 'Project X', 'client': 'Klant X', 'work_week': 40}
result = Project(**project_data) <api.models.project.Project object at 0x0000023271C0B640>

session.add(result)
session.commit() <-- ERROR

return '', 200

I'm confused as to why it complains about a tuple that cannot be converted. Can anyone shed some light on this issue?

Thanks.

CodePudding user response:

In your Project.__init__, you have

    ...
    self.start_date = start_date,
    self.end_date = end_date,
    ...

Note the commas at the end of the lines, which turns these values into tuples.

Is it even necessary to reimplement __init__ like this? The one in Base should already assign kwargs to the respective members, so maybe you could best solve your problem by removing the method altogether...

  • Related