Mysql
 sql >> Base de données >  >> RDS >> Mysql

Django + MySQL - Site d'administration - Ajouter un utilisateur - OperationalError - SAVEPOINT n'existe pas

Ce bug m'a hanté pendant longtemps, j'ai donc décidé de creuser plus loin et d'essayer de le résoudre une fois pour toutes.

Cause principale :le problème SAVEPOINT est un bogue qui se produit uniquement dans MySQL-Python connecteur.

Correction :Utilisez d'autres pilotes MySQL pour Python (par exemple, mysqlclient ).

Détails/Conclusions :

  • J'ai essayé les fichiers binaires MySQL dans Homebrew, MAMP et XAMPP pour Mac.
  • J'ai essayé différentes versions de MySQL, 5.6 (libmysqlclient.18.dylib ) et 5.7 (libmysqlclient.20.dylib ).
  • Essayé plusieurs pilotes MySQL de Python.

Aucune relation trouvée en faisant varier les binaires/versions MySQL. Mais j'ai réduit le problème en testant divers pilotes MySQL couramment utilisés en Python :

  1. MySQLdb (connecteur de base de données largement utilisé mais ancien, le dernier commit remonte à 7 ans !) :

    $ pip install MySQL-python

  2. mysqlclient (version moderne de MySQL-python , mais avec de nombreuses corrections de bugs et améliorations) :

    $ pip install mysqlclient

  3. PyMySQL (pilote de base de données Python MySQL pur) :

    $ pip install PyMySQL

    Ensuite, ajoutez settings.py (juste en dessous du import os ):

    try:
        import pymysql
        pymysql.install_as_MySQLdb()
    except:
        pass
    
  4. MySQL-Connector-Python par Oracle (pilote de base de données Python MySQL pur) :

    $ pip install mysql-connector-python-rf

    Ensuite, modifiez le ENGINE de la base de données configuration dans settings.py :

    'ENGINE': 'mysql.connector.django',
    

Le problème SAVEPOINT se produit uniquement lors de l'utilisation de MySQL-python connecteur (pilote #1), mais pas dans les autres (pilotes #2, #3, #4). Dans mon cas, j'avais choisi le mysqlclient . Le problème est résolu maintenant.