2016-06-13 28 views
1

Ich versuche mysql von pytest-dbfixtures zu verwenden. Ich habe eine Testdatei mit Beispiel aus der Dokumentation:pytest mysql db fixture: kann keine Datenbank erstellen

def test_using_mysql(mysql): 
    mysql.query("SELECT CURRENT_USER()") 

und wenn ich es über $ py.test test_example.py laufen, bekomme ich diesen Fehler:

E    subprocess.CalledProcessError: Command '/usr/bin/mysql_install_db --user=Fluffy --datadir=/tmp/mysqldata_3307' returned non-zero exit status 127 

/usr/local/Cellar/python3/3.5.1/Frameworks/Python.framework/Versions/3.5/lib/python3.5/subprocess.py:711: CalledProcessError 
    ------------------- Captured stderr setup ------ 
    [ERROR] /bin/sh: /usr/bin/mysql_install_db: No such file or directory 

Ich verwende Python 3.5 und OS X 10.11.5. MySQL 5.7.12 wird über homebrew installiert und funktioniert gut.

homebrew erstellt keine Symlimks zu /usr/bin, nur zu /usr/local/bin. Wenn ich den Link manuell erstellen:

$ sudo ln -s /usr/local/Cellar/mysql/5.7.12/bin/mysql_install_db /usr/bin/mysql_install_db 

ich folgende Fehlermeldung aus pytest erhalten:

E    subprocess.CalledProcessError: Command '/usr/bin/mysql_install_db --user=Fluffy --datadir=/tmp/mysqldata_3307' returned non-zero exit status 1 

/usr/local/Cellar/python3/3.5.1/Frameworks/Python.framework/Versions/3.5/lib/python3.5/subprocess.py:711: CalledProcessError 
------------------------- Captured stderr setup ---------------------- 
[ERROR] Can't locate the language directory. 

Auch Skript mysql_install_db ist veraltet: http://dev.mysql.com/doc/refman/5.7/en/mysql-install-db.html

Wie verwende ich mysql Befestigung von pytest dbfixtures ? Gibt es eine Möglichkeit, es unter OS X mit MySQL 5.7 zu verwenden?

+0

Könnten Sie ein kleines Beispiel dafür zeigen, wie Sie das 'mysql' Fixture referenzieren? –

+1

aktualisiert den Beitrag –

+0

Nur um zu klären, das gleiche Beispiel funktioniert auf vagrant Maschine mit Ubuntu. –

Antwort

0

Einige Informationen über meine Set up:

  • Mac OS X 10.11.5
  • Python 3.4.4
  • MySQL Community Edition 5.7.13

ich nicht genau wurde Sie können das Problem reproduzieren, auf das Sie gerade stoßen, aber ich denke, einige der folgenden Informationen sollten nützlich sein.

Pakete erforderlich:

pytest==2.9.2 
pytest-dbfixtures==0.13.1 
mysqlclient==1.3.7 

ich mysqlclient zunächst nicht installieren konnte (bekam: "OSError: mysql_config not found"), weil mysql war auf dem Weg nicht. Hinzugefügt /usr/local/mysql/bin auf den Weg in .bash_profile

Jetzt müssen Sie pytest-dbfixtures konfigurieren Ihre mysql Verbindung zu verwenden. Für mich wurde die Conf-Datei befindet sich hier (I virtualenv bin mit):

~/.virtualenvs/py3.4-PySA/lib/python3.4/site-packages/pytest_dbfixtures/conf/dbfixtures.conf

Für Sie sollte die Konfigurationsdatei in Ihrem Python 3.5-Installationsverzeichnis irgendwo sein (dort navigieren und tun find . -name dbfixtures.conf).

Es gibt einen Abschnitt in pytest_dbfixtures/conf/dbfixtures.conf Ihr mysql Benutzer, Passwort zu setzen, und die Pfade zu lokalen MySQL-Binärdateien (keine Notwendigkeit, Symlinks zu verwenden). Sie sollten ein Passwort für den Benutzer root erhalten haben, als Sie MySQL installiert haben (das heißt, Sie müssen es auf etwas Neues zurücksetzen).

Sie sollten in Erwägung ziehen, einen neuen Benutzer für MySQL zu erstellen und stattdessen dessen Anmeldeinformationen zu verwenden (vielleicht sehen Sie sich die Konfiguration auf dem Ubuntu-Server an, auf den Sie in den Kommentaren verwiesen haben).

Wenn Sie darauf bestehen, den MySQL root Benutzer zu verwenden, könnte dies helfen. Ich ging in mysql über das Terminal zu überprüfen und zu versuchen, scheinbar SELECT CURRENT_USER() auf dem root MySQL-Benutzer zu tun, müssen folgende Voraussetzungen erfüllt:

mysql> SELECT CURRENT_USER(); 
ERROR 1820 (HY000): You must reset your password using ALTER USER statement before executing this statement. 

Mit ALTER: http://dev.mysql.com/doc/refman/5.7/en/resetting-permissions.html

Dann zurück zu dbfixtures.conf gehen und das Passwort entsprechend aktualisieren.

Leider bekomme ich hier fest:

def stop_server_and_remove_directory(): 
     shutdown_server = (
      mysql_admin_exec, 
      '--socket=%s' % unixsocket, 
      '--user=%s' % config.mysql.user, 
      'shutdown' 
     ) 
>  subprocess.check_output(' '.join(shutdown_server), shell=True) 

~/.virtualenvs/py3.4-PySA/lib/python3.4/site-packages/pytest_dbfixtures/factories/mysql.py:143: 
_ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ 

... 
>    raise CalledProcessError(retcode, process.args, output=output) 
E    subprocess.CalledProcessError: Command '/usr/local/mysql/bin/mysqladmin --socket=/tmp/mysql.3307.sock --user=root shutdown' returned non-zero exit status 1 

/Library/Frameworks/Python.framework/Versions/3.4/lib/python3.4/subprocess.py:620: CalledProcessError 

Ausführen den gleichen mysqladmin Befehls über den Anschluss führt zu einem auth failure. Könnte nur ich sein.

Lassen Sie mich wissen, wie weit Sie kommen.