选择测试数据库?
我试图逃跑
./manage.py test
但它告诉我
创建测试数据库时出错:创建数据库的权限被拒绝
显然它没有创建数据库的权限,但我在共享服务器上,所以对此我无能为力。我可以通过控制面板创建一个新的数据库,但我不认为有任何方法可以让 Django 自动完成它。
那么,我不能手动创建测试数据库并告诉 Django 每次刷新它,而不是重新创建整个数据库吗?
I'm trying to run
./manage.py test
But it tells me
Got an error creating the test database: permission denied to create database
Obviously it doesn't have permission to create the database, but I'm on a shared server, so there's not much I can do about that. I can create a new database through the control panel but I don't think there's any way I can let Django do it automatically.
So, can't I create the test database manually and instead tell Django to flush it every time, rather than recreating the whole thing?
如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。
绑定邮箱获取回复消息
由于您还没有绑定你的真实邮箱,如果其他用户或者作者回复了您的评论,将不能在第一时间通知您!
发布评论
评论(11)
我有类似的问题。但我希望 Django 绕过为我的一个实例创建测试数据库(它不是镜像)。按照 Mark 的建议,我创建了一个自定义测试运行程序,如下所示
然后我在 settings.py 内的一个数据库条目之一中创建了一个额外的字典条目,
'BYPASS_CREATION':'yes',
最后,我配置了一个新的测试运行程序
I had a similar issue. But I wanted Django to just bypass the creation of a test database for one of my instances (it is not a mirror tough). Following Mark's suggestion, I created a custom test runner, as follows
Then I created an extra dict entry in one of my databases entries inside settings.py,
'BYPASS_CREATION':'yes',
Finally, I configured a new TestRunner with
我建议使用 sqlite3 进行测试,同时继续使用 mysql/postgres/etc 进行生产。
这可以通过将其放在设置文件中来实现:
请参阅使用 sqlite 运行 django 测试
将在您的 django 项目主目录中创建一个临时 sqlite 数据库文件,您将对其具有写访问权限。另一个优点是 sqlite3 的测试速度要快得多。然而,如果您使用任何 mysql/postgres 特定的原始 sql(无论如何您都应该尽量避免),您可能会遇到问题。
I would suggest using sqlite3 for testing purposes while keeping on using mysql/postgres/etc for production.
This can be achieved by placing this in your settings file:
see Running django tests with sqlite
a temporary sqlite database file will be created in your django project home which you will have write access to. The other advantage is that sqlite3 is much faster for testing. You may however run in to problems if you are using any mysql/postgres specific raw sql (which you should try to avoid anyway).
我认为更好的解决方案可能是 define您自己的测试运行程序。
I think a better solution might be to define your own test runner.
我将其添加到上面的评论中,但它有点丢失了 - 最近对 webfaction 的更改使这变得更加容易。您现在可以创建新的私有数据库实例< /a>.
请按照此处的说明进行操作,并在创建新用户时确保授予他们
ALTER USER new_username CREATEDB;
的权限。您可能还应该更改默认的 cron 设置,这样它们就不会尝试检查该数据库是否正常启动并运行。
I added this to the comments above but it got kind of lost - recent changes to webfaction make this MUCH easier. You can now create new private database instances.
Follow the instructions there, and when creating a new user make sure to give them the permission to
ALTER USER new_username CREATEDB;
.You probably also should change the default cron settings so they don't try to check if this database is up and runnings as frequently.
您可以使用 django-nose 作为 TEST_RUNNER。安装后,如果传递以下环境变量,则不会删除并重新创建数据库(请先自行手动创建)。
您还可以将以下内容添加到settings.py,这样您就不必每次要运行测试时都编写REUSE_DB=1:
注意:这也会将所有表保留在数据库中,这意味着测试设置会快一点,但是当您更改模型时,您将必须手动更新表(或自行删除并重新创建数据库)。
You could use django-nose as your TEST_RUNNER. Once installed, if you pass the following environment variable, it will not delete and re-create the database (create it manually yourself first).
You can also add the following to settings.py so you don't have to write REUSE_DB=1 every time you want to run tests:
Note: this will also leave all your tables in the databases which means test setup will be a little quicker, but you will have to manually update the tables (or delete and re-create the database yourself) when you change your models.
我的重用数据库的变体:
my variant to reusing database:
以下是使用 Webfaction XML-RPC API 创建数据库的 django 测试套件运行程序。请注意,使用 API 设置数据库可能需要长达一分钟的时间,并且脚本可能会出现暂时卡住的情况,请稍等片刻。
注意:在 webfaction 服务器中拥有控制面板密码存在安全风险,因为有人侵入您的 Web 服务器 SSH 可能会接管您的 Webfaction 帐户。如果这是一个问题,请将 USE_SESSKEY 设置为 True 并使用此脚本下面的结构脚本将会话 ID 传递到服务器。会话密钥自上次 API 调用后 1 小时后过期。
文件 test_runner.py:在服务器中,您需要配置 ./manage.py test 以使用 WebfactionTestRunner
文件 webfaction.py:这是 Webfaction API 的瘦包装器,它需要可由 test_runner.py(在远程服务器)和 fabfile.py(在本地计算机中)
文件 fabfile.py:用于生成会话密钥的示例结构脚本,仅当 USE_SESSKEY=True 时才需要
The following is a django test suite runner to create database using Webfaction XML-RPC API. Note, setting up the database using the API may take up to a minute, and the script may appear to be stuck momentarily, just wait for a little while.
NOTE: there is a security risk of having control panel password in the webfaction server, because someone breaching into your web server SSH could take over your Webfaction account. If that is a concern, set USE_SESSKEY to True and use the fabric script below this script to pass a session id to the server. The session key expires in 1 hour from the last API call.
File test_runner.py: in the server, you need to configure ./manage.py test to use WebfactionTestRunner
File webfaction.py: this is a thin wrapper for Webfaction API, it need to be importable by both test_runner.py (in the remote server) and the fabfile.py (in the local machine)
File fabfile.py: A sample fabric script to generate session key, needed only if USE_SESSKEY=True
接受的答案对我不起作用。它已经过时了,无法在我的 djano 1.5 遗留代码库上运行。
我写了一篇博客文章,完全描述了我如何通过创建替代测试来解决这个问题运行器并更改 django 设置以提供所有必需的配置并使用新的测试运行器。
The accepted answer didn't work for me. It's so outdated, that it didn't run on my legacy codebase with djano 1.5.
I wrote a blogpost entirely describing how I solved this issue by creating an alternative test runner and changing django settings to provide all the required config and to use new test runner.
使用单元测试时需要指定 sqlite ENGINE。打开 settings.py 并在 DATABASES 部分之后添加:
You need to specify a sqlite ENGINE when using unit tests. Open the settings.py and add the just after DATABASES section:
修改
django/db/backends/creation.py
中的以下方法:似乎有效...如果需要,只需将额外的设置添加到
settings.py
中。Modify the following methods in
django/db/backends/creation.py
:Seems to work... just add the extra settings to your
settings.py
if you need 'em.简单的解决方法:根据需要更改
django/db/backends/base/creation.py
中的TEST_DATABASE_PREFIX
。Simple workaround: change
TEST_DATABASE_PREFIX
indjango/db/backends/base/creation.py
as you like.