0

I'm using peewee for a Python ORM to a MySQL database and Flask to serve a web site from my local desktop running Ubuntu. I can connect to the database from the command line (mysql test -u user -p), but am getting a connection refused error when trying from Python. This code has worked on my previous Ubuntu PC, and I dumped the database from there, imported into the new PC and granted permissions, so I'm really not sure why it's giving me this.

Model.py:


from peewee import MySQLDatabase, Model, AutoField, CharField, IntegerField, \
     ForeignKeyField, BooleanField, TextField, DateTimeField
from flask_security import UserMixin, RoleMixin

class BaseModel(Model):
    """
    Base model for the model classes; prevents having to define Meta class with the
    database for each Model class. Must call BaseModel._meta.database.init() before
    connecting - should be able to just call once on BaseModel before
    using derived model classes.
    """
    class Meta:
        database = MySQLDatabase(None) #init before calling connect()

#Additional code to define various tables

Trying to connect in Python command line:

import Model as mmm
db = mmm.BaseModel._meta.database
db.init('test', host = 'localhost', user = 'mike', passwd = password, port = 3306)
db.connect()

Error stack trace:

Traceback (most recent call last):
  File "/home/mike/.local/lib/python3.8/site-packages/pymysql/connections.py", line 569, in connect
    sock = socket.create_connection(
  File "/usr/lib/python3.8/socket.py", line 808, in create_connection
    raise err
  File "/usr/lib/python3.8/socket.py", line 796, in create_connection
    sock.connect(sa)
ConnectionRefusedError: [Errno 111] Connection refused

During handling of the above exception, another exception occurred:

Traceback (most recent call last):
  File "/home/mike/.local/lib/python3.8/site-packages/peewee.py", line 3035, in connect
    self._state.set_connection(self._connect())
  File "/home/mike/.local/lib/python3.8/site-packages/peewee.py", line 3933, in _connect
    conn = mysql.connect(db=self.database, **self.connect_params)
  File "/home/mike/.local/lib/python3.8/site-packages/pymysql/__init__.py", line 94, in Connect
    return Connection(*args, **kwargs)
  File "/home/mike/.local/lib/python3.8/site-packages/pymysql/connections.py", line 327, in __init__
    self.connect()
  File "/home/mike/.local/lib/python3.8/site-packages/pymysql/connections.py", line 619, in connect
    raise exc
pymysql.err.OperationalError: (2003, "Can't connect to MySQL server on 'aspire' ([Errno 111] Connection refused)")

During handling of the above exception, another exception occurred:

Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
  File "/home/mike/.local/lib/python3.8/site-packages/peewee.py", line 3038, in connect
    self._initialize_connection(self._state.conn)
  File "/home/mike/.local/lib/python3.8/site-packages/peewee.py", line 2873, in __exit__
    reraise(new_type, new_type(exc_value, *exc_args), traceback)
  File "/home/mike/.local/lib/python3.8/site-packages/peewee.py", line 183, in reraise
    raise value.with_traceback(tb)
  File "/home/mike/.local/lib/python3.8/site-packages/peewee.py", line 3035, in connect
    self._state.set_connection(self._connect())
  File "/home/mike/.local/lib/python3.8/site-packages/peewee.py", line 3933, in _connect
    conn = mysql.connect(db=self.database, **self.connect_params)
  File "/home/mike/.local/lib/python3.8/site-packages/pymysql/__init__.py", line 94, in Connect
    return Connection(*args, **kwargs)
  File "/home/mike/.local/lib/python3.8/site-packages/pymysql/connections.py", line 327, in __init__
    self.connect()
  File "/home/mike/.local/lib/python3.8/site-packages/pymysql/connections.py", line 619, in connect
    raise exc
peewee.OperationalError: (2003, "Can't connect to MySQL server on 'aspire' ([Errno 111] Connection refused)")
manganmus
  • 1
  • 1
  • I found a solution at https://stackoverflow.com/questions/6885164/pymysql-cant-connect-to-mysql-on-localhost - specify unix_socket instead of host. Per https://dev.mysql.com/doc/refman/8.0/en/connecting.html, connections to localhost on Unix use a socket file by default. I probably have some configuration error so it wasn't using the right socket address, but I ran mysqladmin variables | grep socket to get the correct socket and specified that. – manganmus Feb 27 '22 at 20:15

0 Answers0