对于使用多个数据库的金字塔应用程序。我正在声明我的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调用。应该有更优雅的方式!
答案 0 :(得分:0)
我通过启动另一个专门用于测试的MySQL实例来解决这个问题。我现在在另一个端口上有另一个MySQL服务器,而不是在同一个MySQL服务器上使用不同名称的测试数据库。运行多个服务器是内置到MySQL中的(请参阅文档here和here),这里是我在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,chown
至mysql: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
而不是端口号。