And*_*ius 158 python sql django postgresql django-testing
当我尝试使用命令测试任何应用程序时(当我尝试使用使用此命令的fabric部署myproject时我注意到了它):
python manage.py test appname
Run Code Online (Sandbox Code Playgroud)
我收到此错误:
Creating test database for alias 'default'...
Got an error creating the test database: permission denied to create database
Type 'yes' if you would like to try deleting the test database 'test_finance', or 'no' to cancel
Run Code Online (Sandbox Code Playgroud)
syncdb命令似乎有效.我在settings.py中的数据库设置:
DATABASES = {
'default': {
'ENGINE': 'django.db.backends.postgresql_psycopg2', # Add 'postgresql_psycopg2', 'mysql', 'sqlite3' or 'oracle'.
'NAME': 'finance', # Or path to database file if using sqlite3.
'USER': 'django', # Not used with sqlite3.
'PASSWORD': 'mydb123', # Not used with sqlite3.
'HOST': '127.0.0.1', # Set to empty string for localhost. Not used with sqlite3.
'PORT': '', # Set to empty string for default. Not used with sqlite3.
}
}
Run Code Online (Sandbox Code Playgroud)
Ala*_*air 335
当Django运行测试套件时,它会根据您的情况创建一个新的数据库test_finance.具有用户名的postgres用户django无权创建数据库,因此出现错误消息.
当您运行migrate或者syncdb,Django不会尝试创建finance数据库,因此您不会收到任何错误.
您可以通过在postgres shell中以超级用户身份运行以下命令,将createdb权限添加到django用户(此堆栈溢出答案的帽子提示).
=> ALTER USER django CREATEDB;
Run Code Online (Sandbox Code Playgroud)
注意:ALTER USER <username> CREATEDB;命令中使用的用户名需要与Django设置文件中的数据库用户匹配.在这种情况下,原始海报,用户作为django上述答案.
Yur*_*pup 14
我找到了解决问题的有趣方法.
事实上,对于MySQL,您可以为不存在的数据库授予权限.
因此,您可以在设置中为测试数据库添加名称"test_finance":
DATABASES = {
'default': {
'ENGINE': 'django.db.backends.postgresql_psycopg2', # Add 'postgresql_psycopg2', 'mysql', 'sqlite3' or 'oracle'.
'NAME': 'finance', # Or path to database file if using sqlite3.
'USER': 'django', # Not used with sqlite3.
'PASSWORD': 'mydb123', # Not used with sqlite3.
'HOST': '127.0.0.1', # Set to empty string for localhost. Not used with sqlite3.
'PORT': '', # Set to empty string for default. Not used with sqlite3.
'TEST': {
'NAME': 'test_finance',
},
}
}
Run Code Online (Sandbox Code Playgroud)
以root用户身份启动MySQL shell:
mysql -u root -p
Run Code Online (Sandbox Code Playgroud)
现在授予MySQL中这个不存在的数据库的所有权限:
GRANT ALL PRIVILEGES ON test_finance.* TO 'django'@'localhost';
Run Code Online (Sandbox Code Playgroud)
现在Django将毫无问题地开始测试.
小智 7
如果数据库是mysql,那么这两个更改将完成。
1.打开mysite/mysite/settings.py
您的数据库设置应该有一个额外的 TEST 块,如projectname_test所示。
DATABASES = {
'default': {
'ENGINE': 'django.db.backends.mysql',
'NAME': 'myproject',
'USER': 'chandan',
'PASSWORD': 'root',
'HOST': 'localhost',
'PORT': '3306',
'TEST': {
'NAME': 'myproject_test',
},
}
}
Run Code Online (Sandbox Code Playgroud)
2.使用mysql命令提示符或mysql工作台键入以下命令,将所有权限授予settings.py中指定的用户
GRANT ALL PRIVILEGES ON myproject_test.* TO 'chandan'@'localhost';
Run Code Online (Sandbox Code Playgroud)
现在您可以运行 python manage.py test polls.
对于Postgres,用户必须具有createdb权限。
ALTER ROLE miriam CREATEDB;
Run Code Online (Sandbox Code Playgroud)
请参阅此文档:https : //docs.djangoproject.com/en/2.0/topics/testing/overview/#the-test-database
就我而言, GRANT PRIVILEGES 解决方案不适用于Python 3.7.2、Django 2.1.7和MySQL 5.6.23 ......我不知道为什么。
所以我决定使用 SQLite 作为 TEST 数据库......
DATABASES = {
'default': {
'NAME': 'productiondb',
'ENGINE': 'mysql.connector.django', # 'django.db.backends.mysql'
'USER': '<user>',
'PASSWORD': '<pass>',
'HOST': 'localhost',
'PORT': 3306,
'OPTIONS': {
'autocommit': True,
},
'TEST': {
'ENGINE': 'django.db.backends.sqlite3',
'NAME': os.path.join(BASE_DIR, 'db.sqlite3'),
},
}
}
Run Code Online (Sandbox Code Playgroud)
之后,TESTS 车就顺利运行了:
$ python manage.py test
Creating test database for alias 'default'...
System check identified no issues (0 silenced).
Destroying test database for alias 'default'...
----------------------------------------------------------------------
Ran 0 tests in 0.000s
OK
Process finished with exit code 0
Run Code Online (Sandbox Code Playgroud)
哇,结合这里的所有答案并进行一些调整,终于让我找到了 docker-compose、django 和 postgres 的工作解决方案......
首先,noufal valapra 给出的 postgres 命令不正确(或者可能只是不是最新的),它应该是:
ALTER USER docker WITH CREATEDB;
Run Code Online (Sandbox Code Playgroud)
在 docker-compose 设置的情况下,这将进入 init.sql 文件,这就是我的样子:
CREATE USER docker;
ALTER USER docker WITH CREATEDB;
CREATE DATABASE djangodb;
GRANT ALL PRIVILEGES ON DATABASE djangodb TO docker;
Run Code Online (Sandbox Code Playgroud)
那么 postgres 的 Dockerfile 看起来像这样:
FROM postgres:10.1-alpine
COPY init.sql /docker-entrypoint-initdb.d/
Run Code Online (Sandbox Code Playgroud)
然后 Django settings.py 有这个条目:
if 'RDS_DB_NAME' in os.environ:
INTERNAL_DATABASES = {
'default': {
'ENGINE': 'django.db.backends.postgresql_psycopg2',
'NAME': os.environ['RDS_DB_NAME'],
'USER': os.environ['RDS_USERNAME'],
'PASSWORD': os.environ['RDS_PASSWORD'],
'HOST': os.environ['RDS_HOSTNAME'],
'PORT': os.environ['RDS_PORT'],
}
}
Run Code Online (Sandbox Code Playgroud)
docker-compose 看起来像这样:
版本:'3.6'
服务:
postgresdb:
build:
context: ./
dockerfile: ./Dockerfile-postgresdb
volumes:
- postgresdata:/var/lib/postgresql/data/
django:
build:
context: ../
dockerfile: ./docker/Dockerfile
environment:
- RDS_DB_NAME=djangodb
- RDS_USERNAME=docker
- RDS_PASSWORD=docker
- RDS_HOSTNAME=postgresdb
- RDS_PORT=5432
stdin_open: true
tty: true
depends_on:
- postgresdb
volumes:
postgresdata:
Run Code Online (Sandbox Code Playgroud)
小智 5
通过键入以下内容切换到服务器上的 postgres 帐户:
sudo -i -u postgres
Run Code Online (Sandbox Code Playgroud)
现在,您可以通过键入以下内容立即访问 Postgres 提示符:
psql
Run Code Online (Sandbox Code Playgroud)
现在输入
ALTER USER username CREATEDB;
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
56859 次 |
| 最近记录: |