标签: django-database

关于数据库类型的Django Migration RunSQL条件

我试图使用migrations.RunSQLDjango迁移来运行一些任意的SQL代码.我想仅针对某些db后端运行此迁移(例如仅针对postgres).

我想使用这样的东西,但我没有看到类中的数据库连接信息Migration.

django django-orm django-database django-migrations

14
推荐指数
4
解决办法
2869
查看次数

Django和NoSQL,任何现成的库?

到目前为止,Django与几个RDBMS有很好的集成.NoSQL,无架构和面向文档的DBMS正在崛起.将这些流行时尚的DBMS与Django集成在一起的状态如何?是否有适用于Django的生产就绪或至少可立即使用的库?

到目前为止,我手头有这些:

django schemaless nosql django-database

13
推荐指数
1
解决办法
5844
查看次数

Django原子请求如何工作?

我希望我的Django视图是原子的.我的意思是,如果视图中有2个DB写入,我想要0写入,要么写入2个.

例如:

def test_view(request):
    ''' A test view from views.py '''

    MyClass.objects.create()
    raise Exception("whatever")
    MyClass.objects.create()
Run Code Online (Sandbox Code Playgroud)

我在文档中发现的看起来很有希望:

处理Web上的事务的常用方法是将每个请求包装在事务中.在要为其启用此行为的每个数据库的配置中将ATOMIC_REQUESTS设置为True.

它的工作原理如下.在调用视图函数之前,Django启动一个事务.如果生成的响应没有问题,Django会提交事务.如果视图产生异常,Django将回滚事务.

但是,即使我设置ATOMIC_REQUESTS = True,在调用时test_view(),也会创建第一个MyClass对象!我错过了什么?

注意:我正在使用Django 1.7

python django atomic django-database

13
推荐指数
1
解决办法
5921
查看次数

如何计算Django中数据库表中的行数

我已经通过数据库的Django模型,在那里创建statusidusername是表的字段Messages.

我需要计算status value= 0特定行的行数username.

这是我不完整的代码:

Message_me = Messages.objects.get(username='myname')
Run Code Online (Sandbox Code Playgroud)

django django-models django-database

12
推荐指数
2
解决办法
3万
查看次数

Django ManyToMany通过多个数据库

TLTR: Django 在SQL查询中不包含数据库名称,我可以以某种方式强制它执行此操作还是有解决方法?

长版:

我有两个遗留的 MySQL 数据库(注意:我对数据库布局没有影响),我正在使用Django 1.11和python 3.6上的DRF 创建一个只读API

我正在使用此处建议的SpanningForeignKey字段来解决MyISAM DB的参照完整性限制:https://stackoverflow.com/a/32078727/7933618

我正在尝试通过MultiToMany通过DB1上的表将DB1中的表连接到DB2中的表.这是Django正在创建的查询:

SELECT "table_b"."id" FROM "table_b" INNER JOIN "throughtable" ON ("table_b"."id" = "throughtable"."b_id") WHERE "throughtable"."b_id" = 12345
Run Code Online (Sandbox Code Playgroud)

这当然给了我一个错误"表'DB2.throughtable'不存在",因为viatable在DB1上,我不知道如何强制Django使用DB名称为表添加前缀.查询应该是:

SELECT table_b.id FROM DB2.table_b INNER JOIN DB1.throughtable ON (table_b.id = throughtable.b_id) WHERE throughtable.b_id = 12345
Run Code Online (Sandbox Code Playgroud)

app1的 型号db1_app/models.py:(DB1)

class TableA(models.Model):
    id = models.AutoField(primary_key=True)
    # some other fields
    relations = models.ManyToManyField(TableB, through='Throughtable')

class Throughtable(models.Model):
    id = models.AutoField(primary_key=True)
    a_id = models.ForeignKey(TableA, to_field='id')
    b_id = …
Run Code Online (Sandbox Code Playgroud)

python mysql django django-database

12
推荐指数
2
解决办法
1775
查看次数

如何使用Django South为现有App创建新数据库并设置默认值?

我正在使用一个使用South迁移数据库的操作系统项目.我正在从头开始构建一个新的数据库,我想确保设置South以便将来轻松更新数据库.

看来这个过程应该是:

  1. 创建数据库
  2. 执行syncdb
  3. 迁移

但是,当我尝试迁移数据库时,早期迁移之一(迁移0004并且转到0009)会引发异常:

ValueError: You cannot add a null=False column without a default value.
Run Code Online (Sandbox Code Playgroud)

我不明白如何向迁移0004添加默认值,因此不会抛出此异常.

由于数据库为空,因此无需运行迁移.

但是, south_migrationhistory必须包含所有迁移的列表以及何时应用它们.

我试图破解它,只是手动将迁移0009添加到数据库,但这引发了另一个错误,因为尚未运行中间迁移.我还尝试向数据库添加一个字段,以查看我是否能够找出add_column的语法,其默认值为0.该格式与这些较旧的迁移完全不同.

以下是add_column语法的2个不同版本:

#0004 syntax:  
db.add_column('experiments_dailyreport', 'test_group_size', orm['experiments.dailyreport:test_group_size'])
#0009 syntax:
syntax db.add_column('experiments_dailyreport', 'test_group_size', self.gf('django.db.models.fields.IntegerField')(default=0), keep_default=False)
Run Code Online (Sandbox Code Playgroud)

所以,我猜测在创建0004和今天之间南方代码发生了变化.

有没有办法用syncdb构建数据库,然后以某种方式更新south_migrationhistory而不运行manage.py migrate?

如果您有一个具有南迁移的现有应用程序,您将如何从头开始构建新数据库?

我无法迁移,因为整数字段没有默认设置.如何在较早的迁移中设置默认值?该领域甚至不再存在.

尝试语法:

db.add_column('experiments_dailyreport', 'test_group_size', orm['experiments.dailyreport:test_group_size'], {'default': 0})
#throws ValueError: You cannot add a null=False column without a default value.
db.add_column('experiments_dailyreport', 'test_group_size', self.gf('django.db.models.fields.IntegerField')(default=0), keep_default=False)
#throws AttributeError: Migration instance has no attribute 'gf'
Run Code Online (Sandbox Code Playgroud)

我正在使用South-0.7.2-py2.7.egg

django django-database django-south

11
推荐指数
1
解决办法
1万
查看次数

"返回该页面可能会导致您重复采取任何行动" - Django

我的网站上有一个表单,可以在数据库中创建一个条目.因此每次刷新页面时,我都会先得到此消息:

The page that you're looking for used information that you entered.
Returning to that page might cause any action you took to be repeated.
Do you want to continue?
Run Code Online (Sandbox Code Playgroud)

显然,我不希望在我的数据库中多次使用相同的信息.

以防万一:这是我的代码(我知道有很多需要删除的垃圾):

#views.py
@login_required
def subject(request,username, subject_name):
    subject_id = Subjects.objects.filter(user = request.user).get(name=subject_name)
    #Upload form
    if request.method == "POST":
        if "upload-b" in request.POST:
            form = ContentForm(request.POST, request.FILES, instance=subject_id)       
            if form.is_valid(): # need to add some clean functions
                 up_f = FileDescription.objects.get_or_create(subject=subject_id,
                                                  subject_name=subject_name,
                                                  file_type=request.POST['file_type'],
                                                  file_uploaded_by = username,
                                                  file_name=request.POST['file_name'],
                                                  file_description=request.POST['file_description'],
                                                  image = request.FILES['image'],
                                                  ) …
Run Code Online (Sandbox Code Playgroud)

django django-models django-database

11
推荐指数
1
解决办法
2万
查看次数

多个字段到同一个DB列

我们正试图加快我们的应用程序prefetch_related.它可以跟随GenericForeignKey关系,它可以更深入,__但不幸的是,如果相关模型没有这样的领域,它将失败.

这是模型结构的一些例子

class ModelA(models.Model):
    event_object = models.ForeignKey(SomeModelA)

class ModelB(models.Model):
    event = models.ForeignKey(SomeModelB)

class ModelC(models.Model):
    content_type = models.ForeignKey(ContentType)
    object_id = models.PositiveIntegerField()
    content_object = generic.GenericForeignKey()
Run Code Online (Sandbox Code Playgroud)

所以ModelC实例可以指向ModelAModelB.我可以使用这样的查询集来预取A和B模型:ModelC.objects.all().prefetch_related('content_object')不幸的是我还需要选择事件对象(SomeModelASomeModelB)

如果我试着跑

ModelC.objects.all().prefetch_related('content_object', 'content_object__event_object')
Run Code Online (Sandbox Code Playgroud)

如果我只有ModelC指向的实例,它将工作ModelA,但在更坏的情况下,它将失败,因为ModelB没有该event_object字段event而是.

这个模型在代码中的许多地方使用,因此重命名字段不是一个好主意.所以我想知道是否有办法为字段/列创建别名.

我试图这样做:

class ModelB(models.Model):
    event = models.ForeignKey(SomeModelB)
    event_object = models.ForeignKey(SomeModelB, db_column='event_id', related_name='+')
Run Code Online (Sandbox Code Playgroud)

使两个字段指向DB表中的同一列.然而,这不起作用,因为它打破了save方法.Django创建一个UPDATESQL查询,其中一列放置两次并获取DatabaseError

有没有办法创建这样的别名?或者也许还有另一种解决方案可以prefetch_related不抛出异常?

更新:在save方法中,有一个 …

python django django-models django-database

11
推荐指数
1
解决办法
1294
查看次数

为 Django.db 连接对象指定只读访问

我有一系列集成级别的测试,它们在我的 Django 项目中作为管理命令运行。这些测试正在验证从外部来源提取到我的数据库中的大量天气数据的完整性。因为我有如此大量的数据,我真的必须针对我的生产数据库进行测试才能使测试有意义。我想弄清楚的是如何定义特定于该命令或连接对象的只读数据库连接。我还应该补充一点,这些测试无法通过 ORM,因此我需要执行原始 SQL。

我的测试结构如下所示

class Command(BaseCommand):
    help = 'Runs Integration Tests and Query Tests against Prod Database'

    def handle(self,*args, **options):
        suite = unittest.TestLoader().loadTestsFromTestCase(TestWeatherModel)
        ret = unittest.TextTestRunner().run(suite)
        if(len(ret.failures) != 0):
            sys.exit(1)
        else:
            sys.exit(0)

class TestWeatherModel(unittest.TestCase):
    def testCollectWeatherDataHist(self):
        wm = WeatherManager()
        wm.CollectWeatherData()
        self.assertTrue(wm.weatherData is not None)
Run Code Online (Sandbox Code Playgroud)

WeatherManager.CollectWeatherData() 方法如下所示:

def CollecWeatherData(self):
    cur = connection.cursor()
    cur.execute(<Raw SQL Query>)
    wm.WeatherData = cur.fetchall()
    cur.close()
Run Code Online (Sandbox Code Playgroud)

我想以某种方式对此进行白痴证明,以便其他人(或我)以后不能出现并意外编写会修改生产数据库的测试。

python django django-testing django-database django-postgresql

11
推荐指数
1
解决办法
1581
查看次数

auto_now_add 和 timezone.now 默认值之间的差异

auto_now_addDjango 中模型的和timezone.now(作为默认值)有什么区别?例子:

create_date = models.DateTimeField(auto_now_add=True)
Run Code Online (Sandbox Code Playgroud)

create_date = models.DateTimeField(default=timezone.now)
Run Code Online (Sandbox Code Playgroud)

UPD。我说的是我总是不覆盖默认值的情况。

python django django-models django-database

10
推荐指数
2
解决办法
3117
查看次数