pytest mysql db fixture:无法创建数据库

时间:2016-06-13 13:16:13

标签: python mysql mysql-python pytest fixtures

我正在尝试使用pytest-dbfixtures中的mysql。我有一个测试文件,其中包含文档中的示例:

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

当我通过$ py.test test_example.py运行时,我收到此错误:

    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

我正在使用python 3.5和OS X 10.11.5。 MySQL 5.7.12是通过homebrew安装的,运行良好。

homebrew不会向/usr/bin创建symlimks,只会创建/usr/local/bin。如果我手动创建链接:

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

我从pytest收到以下错误:

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.

此外,不推荐使用脚本mysql_install_dbhttp://dev.mysql.com/doc/refman/5.7/en/mysql-install-db.html

如何使用pytest dbfixtures中的mysql fixture?有没有办法在OS X上使用MySQL 5.7?

1 个答案:

答案 0 :(得分:0)

有关我设置的一些信息:

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

我无法重现您遇到的问题,但我认为下面的一些信息应该会有用。

所需的套餐:

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

我最初无法安装mysqlclient(得到:"OSError: mysql_config not found"),因为mysql不在路径中。 已将/usr/local/mysql/bin添加到.bash_profile

中的路径

现在,您需要配置pytest-dbfixtures以使用mysql连接。 对我来说,.conf文件位于此处(我使用的是virtualenv):

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

对于您来说,配置文件应该位于Python 3.5安装目录中的某个位置(在那里导航并执行find . -name dbfixtures.conf)。

pytest_dbfixtures/conf/dbfixtures.conf中有一个部分用于设置mysql用户,密码和本地MySQL二进制文件的路径(不需要使用符号链接)。 安装MySQL时,你应该为root用户获得一个密码(说,你需要将它重置为新的)。

您可能需要考虑为MySQL创建新用户并使用其凭据(可能请查看注释中引用的Ubuntu服务器上的配置)。

如果您坚持使用MySQL root用户,这可能有所帮助。我通过终端检查mysql,显然在SELECT CURRENT_USER() MySQL用户上尝试root需要以下内容:

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

使用ALTERhttp://dev.mysql.com/doc/refman/5.7/en/resetting-permissions.html

然后返回dbfixtures.conf并相应地更新密码。

不幸的是,我被困在这里:

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

通过终端执行相同的mysqladmin命令会导致身份验证失败。可能只是我。

让我知道你有多远。