标签: django-database

如何在具有只读访问权限的现有数据库上实现django admin?

我想使用Django管理员浏览和现有数据库,但我想确保我或Django不会对此数据库进行任何修改.

出于这个原因,我想我应该使用两个数据库,一个是只读的,一个是存储其他django表,一个是我有读写访问权限.

我知道如何定义多个数据库,settings.py但我不知道如何强制django为特定模型使用另一个数据库.

django django-models django-database

7
推荐指数
1
解决办法
1869
查看次数

Django 测试:临时数据库文件中没有数据

我使用的 sqlite3 数据库设置如下settings.py

DATABASES = {
    'default': {
        'ENGINE': 'django.contrib.gis.db.backends.spatialite',
        'NAME': 'path/to/config.sqlite',
        'TEST_NAME': 'path/to/test-config.sqlite',
        # ... USER, PASSWORD and PORT left out for brevity
    }
}
Run Code Online (Sandbox Code Playgroud)

在测试运行期间开始于:

python manage.py test myapp.mytest
Run Code Online (Sandbox Code Playgroud)

这会临时创建一个数据库文件path/to/test-config.sqlite,我需要在另一个加载了所需装置的应用程序中使用该文件。

然而,数据库文件是空的,我在一个测试的暂停期间断言:

sqlite> select * from someapp_somemodel;

... no results here :(
Run Code Online (Sandbox Code Playgroud)

其他不需要sqlite文件并且内存数据库就足够的测试用例,不会发生错误。

我的问题:

  • 如果 django 无论如何创建它,为什么不将其数据刷新到数据库文件中?和
  • 我如何说服 django 这样做,因为我需要将数据转储到临时数据库文件中?

编辑

如果有任何兴趣,我正在使用 Django 1.3.1。

编辑2

我熟悉fixtures,我用它们来填充数据库,但我的问题是fixtures 中的数据在测试过程中没有写入数据库文件。对不起,如果我对这个事实不够清楚。

编辑3

由于我的问题需要一些澄清,请考虑以下测试设置(与我实际做的很接近):

class SomeTestCase(django.test.TestCase):
    fixtures = ["some_fixture.json", "some_other_fixture.json"]

    def testSomething(self):
        import pdb; pdb.set_trace()
Run Code Online (Sandbox Code Playgroud)

testSomething方法运行到断点时,我启动sqlite3程序并连接到 …

python sqlite django django-testing django-database

7
推荐指数
1
解决办法
3233
查看次数

Django DynamoDB数据库后端

是否可以将AWS DynamoDB设置为为Django服务器支持的数据库?如果是这样,我该怎么做呢?

谢谢!

python django amazon-web-services django-database amazon-dynamodb

7
推荐指数
1
解决办法
4775
查看次数

git与我们的数据库文件合并冲突(多个开发人员)

一个伙伴和我正在开发一个Django应用程序,并正在使用git(GitHub).

在我们工作的时候,我们会在我们的网站上制作虚假账户,登录并将内容上传到数据库等等,以便进行测试.这是问题:每次我们在GitHub上合并分支时,我们都会遇到与数据库文件的合并冲突.当然,这是因为我们的数据库文件在存储库中,并且由于我们单独测试,因此文件的本地副本会有不同的发展.

我想要做的是让数据库文件在存储库之外.这样,我们可以合并,并始终保持我们自己的数据库副本运行,独立于其他人的本地副本.

但是,我们的settings.py文件必须相同,因此我们无法指定本地路径(即'Users/sgarza62/Desktop'或'Users/rada/Desktop).这是理想的,但settings.py文件是一个共享文件,因此它在存储库的两个副本中必须相同.

通过以下内容,我们已经能够避免使用本地路径:

## settings.py


from os.path import dirname, join

PROJECT_DIR = dirname(__file__)

DATABASES = {
    'default': {
        'ENGINE': 'django.db.backends.sqlite3',
        'NAME': join(PROJECT_DIR, 'foo.db'),
        'USER': '',
        'PASSWORD': '',
        'HOST': '',
        'PORT': '',
    }
}
Run Code Online (Sandbox Code Playgroud)

什么是理想的,是这样的:

## settings.py


from os.path import dirname, join

PROJECT_DIR = dirname(__file__)

DATABASES = {
    'default': {
        'ENGINE': 'django.db.backends.sqlite3',
        'NAME': join('../../../', PROJECT_DIR, 'foo.db'), # this path is outside the repository (ie, 'Users/sgarza62/foo.db')
        'USER': '',
        'PASSWORD': '',
        'HOST': '',
        'PORT': '', …
Run Code Online (Sandbox Code Playgroud)

python git django github django-database

7
推荐指数
2
解决办法
4093
查看次数

Django 1.6和嵌套"与transaction.atomic()"

多年来我一直使用较旧的transaction.commit_on_success和transaction.commit_manually与Django <1.6.但是现在使用Django 1.6,旧的API主要用transaction.atomic替换.

在阅读新API的文档后,我仍然不确定如何将以下代码提交到数据库:

def a_first_function():
    with transaction.atomic():
        a_second_function_successful()
        a_third_function_fails()

def a_second_function_successful():
    with transaction.atomic():
        do_something()

def a_third_function_fails():
    do_something_wrong()
Run Code Online (Sandbox Code Playgroud)

在此示例中,假设从a_first_function调用的a_second_function_successful成功并从模型创建/保存对象.在second_function成功之后,第三个函数被立即调用并失败.

鉴于在第一个和第二个函数中使用了使用上下文管理器的transaction.atomic,在a_second_function_successful中创建/修改的数据会发生什么.它会被提交到数据库吗?它会从第一个函数自动回滚吗?我的经验是,第二个函数将被提交,但是,我预计它不会被提交.

如果第三个函数定义如下,它现在会有什么不同:

@transaction.atomic
def a_third_function_fails():
    do_something_wrong()
Run Code Online (Sandbox Code Playgroud)

或作为:

def a_third_function_fails():
    with transaction.atomic():
        do_something_wrong()
Run Code Online (Sandbox Code Playgroud)

谢谢,

django transactions django-models django-database

7
推荐指数
1
解决办法
4004
查看次数

根据django中的请求动态设置数据库

我正在用python-django编写一个多租户应用程序.

我想根据每个请求设置数据库连接.我想我可以写一个中间件,我们设置数据库用于该特定数据库.

import re
from django.db import connections

class SetTenantDatabase(object):
    def process_request(self, request):
        pattern = re.compile("\\b(http://|https://|www.|.com|8000|:|//)\\W\\d+", re.I)
        words = request.get_host()        
        db_name = [pattern.sub("", words)][0].split('.')[0]
        connections.databases['new-alias'] = { 
        'default': {
                    'ENGINE': 'django.db.backends.postgresql_psycopg2',
                    'NAME': 'store1',
                    'USER': 'xxx',
                    'PASSWORD': 'xxx',
                    'HOST': '127.0.0.1',
    } 
                                              }
        conn = connections['new-alias']
        return None
Run Code Online (Sandbox Code Playgroud)

但这不起作用.我该怎么办呢.方法错了或解决方案是否可行,最后如何?

python django multi-tenant django-database

7
推荐指数
2
解决办法
3409
查看次数

连接到Django后端的AWS Postgres实例

我在AWS上创建了一个PostgreSQL数据库,我想将它用于Django项目.

我修改了settings.py以便它有

DATABASES = {
    'default': {
        'ENGINE': 'django.db.backends.postgresql',
        'NAME': <db name>,
        'USER': <user>,
        'PASSWORD': <password>,
        'HOST': 'projectdevelopment.foobar.us-east-1.rds.amazonaws.com',
        'PORT': '5432',
    }
}
Run Code Online (Sandbox Code Playgroud)

我认为这看起来很简单.除了当我尝试进行迁移时,我收到此错误:

django.db.utils.OperationalError: could not translate host name "projectdevelopment.foobar.us-east-1.rds.amazonaws.com" to address: nodename nor servname provided, or not known
Run Code Online (Sandbox Code Playgroud)

该值projectdevelopment.foobar.us-east-1.rds.amazonaws.com已直接从RDS控制台中端点下的值复制.

我错过了一个设置,还是配置错误了?或两者?

django postgresql amazon-web-services django-database

7
推荐指数
1
解决办法
3262
查看次数

Django和PostgreSQL - 类型字符变化的值太长(512)

我正在从测试SQLite数据库迁移到PostgreSQL数据库.

我有一个插入数据库的示例对象,它在SQLite上工作,但在PostgreSQL中给我一个错误.

代码段是:

car = CarItem.objects.create(
    user = motor_trend,
    name = 'Camaro 2010',
    category = cars,
    condition = 'Used',
    price = '28,547.00',
    production_year = '2010',
    color_interior = 'Black',
    color_exterior = 'Inferno Orange Metallic',
    reference = 'PRC17288',
    location_of_creation = 'Undisclosed',
    location_current = 'Columbus, OH, USA',
    description = 'GORGEOUS ORANGE SS!!',
)
car.save()
Run Code Online (Sandbox Code Playgroud)

我得到一个:

DatabaseError at /create/
value too long for type character varying(512)

Traceback
(...)
    description = 'GORGEOUS ORANGE SS!!',
(...)
Run Code Online (Sandbox Code Playgroud)

我的模型的描述字段有512个最大字符长度:

description = models.CharField(max_length=512,default='')
Run Code Online (Sandbox Code Playgroud)

但是字符串不能超过512字节.

我之前读过有关此错误的帖子,其中一篇涉及编码.似乎并非如此.

我在Webfaction上托管.我创建了一个使用utf-8编码的数据库,然后继续使用syncdb.Syncdb工作正常但现在这个对象插入失败了.

有人可以提供一些意见吗?谢谢.

django postgresql psycopg2 django-database

6
推荐指数
1
解决办法
5723
查看次数

Django:当django启动时只调用一次方法

我想在Django启动时初始化一些变量(来自数据库).

我能够从数据库中获取数据,但问题是如何调用initialize方法.这应该只调用一次.

尝试查看其他页面,但无法找到答案.

代码目前看起来像这样::


def get_latest_dbx(request,....):

#get数据库中的数据


def get_latest_x(request):

get_latest_dbx(请求中,x,......)


def启动(请求):

get_latest_x(请求)

python django django-views django-database

6
推荐指数
1
解决办法
6706
查看次数

Django makemigrations AttributeError:'str'对象没有属性'_meta'

我正在使用django框架,我遇到了运行makemigration命令的问题.这是模型的副本及其生成的堆栈跟踪.我看过几个帖子有同样的错误,但没有一个让我在这里解决我的问题.我正在使用django 1.9.4

from django.db import models
import os, uuid

# Create your models here.
def video_directory_path(instance, folder):
    return os.path.join('video', str(instance.person.id), str(instance.video_id))

def photo_directory_path(instance, folder):
        return os.path.join('image', str(instance.person.id), str(instance.photo_id))


class Image(models.Model):
    name = models.CharField(max_length=128)
    photo_id = models.UUIDField(verbose_name='photo id', default=uuid.uuid4, editable=False, unique=True)
    photo = models.ImageField(upload_to=photo_directory_path)
    person = models.ForeignKey('Person', on_delete=models.CASCADE)
    movie = models.ForeignKey('Movie', on_delete=models.CASCADE)

    class Meta:
        db_table = 'Image'

    def __str__(self):
        return '[{0}- {1}]'.format(self.__class__.__name__, self.id)

    def __repr__(self):
        return self.__str__()


class Video(models.Model):
    name = models.CharField(max_length=128)
    video_id = models.UUIDField(verbose_name='video id', default=uuid.uuid4, editable=False, unique=True) …
Run Code Online (Sandbox Code Playgroud)

django django-models django-database

6
推荐指数
1
解决办法
8608
查看次数