如何在测试期间在Pyramid应用程序中为SqlAlchemy模型类使用不同的模式

时间:2014-10-13 14:34:32

标签: python sqlalchemy pyramid pytest

对于使用多个数据库的金字塔应用程序。我正在声明我的SqlAlchemy类:

class A(MyBase):
    __table_args__ = {'schema': 'schema_a'}

class B(MyBase):
    __table_args__ = {'schema': 'schema_b'}

我想测试生产中使用的数据库类型(MySQL)。但是,我在更改模式时遇到了很大的麻烦,因为__table_args__很早就是进程(在模块加载时)。

我一直在尝试'pytest-dbfixtures',它可以启动一个空的MySQL数据库。由于某种原因,这种方法与标准的Pyramid不兼容 在模块加载时创建SQLAlchemy会话工厂的方法:

DBSession = scoped_session(sessionmaker(extension=ZopeTransactionExtension()))

所以现在我正在诉诸:

class A(MyBase):
    __table_args__ = {'schema': function_generating_schema_name()}

function_generating_schema_name做了一些丑陋的检查以查看代码是否被testrunner调用。应该有更优雅的方式!

1 个答案:

答案 0 :(得分:0)

我通过启动另一个专门用于测试的MySQL实例来解决这个问题。我现在在另一个端口上有另一个MySQL服务器,而不是在同一个MySQL服务器上使用不同名称的测试数据库。运行多个服务器是内置到MySQL中的(请参阅文档herehere),这里是我在Debian 7上设置的方式:

  • 将新服务器的配置添加到/etc/mysql/my.cnf。最初,我把它放在/etc/mysql/conf.d/mynewserver的新文件中,但是mysqld_multi没有在那里拿起它(显然一个人可以有一个完全独立的配置文件,并将其与mysqld_multi --defaults-file=/path/to/file一起使用,但我离题)。 MySQL的多服务器功能通过你可以选择的正整数来识别每个服务器,我选择了13:
[mysqld13]
pid-file        = /var/run/mysqld/mysqld_13.pid
socket          = /var/run/mysqld/mysqld_13.sock
port            = 3307
datadir         = /var/lib/mysql_13
tmpdir          = /tmp/mysql_13
log_error       = /var/log/mysql/error_13.log
  • 创建/var/lib/mysql_13/tmp/mysql_13 dirs,chownmysql:mysql

  • 初始化datadir:mysql_install_db --user=mysql --datadir=/var/lib/mysql_13

  • 启动新服务器:mysqld_multi start 13

  • 尝试连接:mysql -u root -P 3307 -h 127.0.0.1。注意,我有MySQL绑定到0.0.0.0并使用TCP / IP访问它,我在标准的unix套接字配置上,mysql需要--socket=/var/run/mysqld/mysqld_13.sock而不是端口号。