小编bry*_*ryn的帖子

是否有工具来分析sqlite查询?

我正在使用SQLite数据库,并希望加快我的查询,可能是索引或完全重组它们.

是否有一个工具来分析查询,这可能有助于我决定哪些方面正在放慢速度?

我知道我可以在SQLite管理员这样的工具中输入查询来计算它们,但我正在寻找比这更有系统性的东西 - 也许是在后台的东西,看着我输入的所有查询期间,给出任何瓶颈的细分.

sqlite profiling

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

我可以记住Python生成器吗?

我有一个runquery调用函数,它调用数据库,然后逐个产生行.我写了一个memoize装饰器(或者更确切地说,我只是从这个stackoverflow问题中偷走了一个)但是在后续调用中它只产生一个空序列,大概是因为生成器的值只能产生一次.

我怎么能修改适用于Python生成器的memoization装饰器?我意识到我需要在某些时候将它存储在内存中,但我想在装饰器中处理它而不是修改原始函数.

memoization函数的当前代码是:

def memoized(f):
    # Warning: Doesn't work if f yields values
    cache={}
    def ret(*args):
        if args in cache:
            return cache[args]
        else:
            answer=f(*args)
            cache[args]=answer
            return answer
    return ret
Run Code Online (Sandbox Code Playgroud)

python generator memoization

22
推荐指数
2
解决办法
3384
查看次数

是否有一种惯用的get_or_create方法然后更新Django中的对象?

我有一个名为StaffSettings的Django模型,它包含我的Django应用程序中用户的各种配置选项.每个用户在StaffSettings表中最多只有一个条目.

假设一个设置是default_year_level,我有我的用户对象的代码,如:

def set_default_year_level(u, year_level):
    obj, _created = StaffSettings.objects.get_or_create(user=u)
    obj.default_year_level = year_level
    obj.save()
Run Code Online (Sandbox Code Playgroud)

我希望函数的主体适合一行,因为它看起来像一个常见的用例,但如果我将其定义为

def set_default_year_level(u, year_level):
    StaffSettings.objects.filter(user=u).update(default_year_level=year_level)
Run Code Online (Sandbox Code Playgroud)

如果有问题的用户已在StaffSettings表中有一行,但如果它不存在则不会创建相关行,这可以正常工作.

编写此代码的惯用/最佳方法是什么?(例如,是否存在某种filter_or_create功能?还是其他人编写装饰器/辅助函数来处理这个习惯用法?)

django idioms django-models

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

删除相关数据后,在DeleteView上使用get_success_url

在使用配方的Django应用程序中,我已DeleteView创建了子类IngredientListItemDeleteView,但我希望结果get_success_url依赖于刚刚删除的项的属性.

我想做这样的事情:

def get_success_url(self):
    item = get_object_or_404(IngredientListItem, pk=self.kwargs['pk'])   # -> 404
    return this_item.recipe.get_absolute_url()
Run Code Online (Sandbox Code Playgroud)

我知道我收到404错误,因为有问题的项目不再存在,但我没有运气存储关于该项目的相关信息(即其包含的食谱),然后才被删除.例如,如果我将get任何代码放入方法中

self.success_url = get_object_or_404(IngredientListItem, 
                                pk=self.kwargs['pk']).recipe.get_absolute_url()
Run Code Online (Sandbox Code Playgroud)

然后到时候success_url看(删除后),它的值为None.

如何使我的成功URL取决于已删除项目的此属性?

django django-class-based-views

5
推荐指数
1
解决办法
3802
查看次数

为什么我的django批量数据库数量如此之慢并经常失败?

我决定使用django的模型系统而不是编写原始SQL来与我的数据库接口,但我遇到的问题肯定是可以避免的.

我的models.py包含:

class Student(models.Model):
    student_id = models.IntegerField(unique = True)
    form = models.CharField(max_length = 10)
    preferred = models.CharField(max_length = 70)
    surname = models.CharField(max_length = 70)
Run Code Online (Sandbox Code Playgroud)

我通过循环遍历列表来填充它,如下所示:

from models import Student

for id, frm, pref, sname in large_list_of_data: 
   s = Student(student_id = id, form = frm, preferred = pref, surname = sname)
   s.save()
Run Code Online (Sandbox Code Playgroud)

我真的不想每次都将它保存到数据库中,但我不知道另一种方法让django不要忘记它(我宁愿添加所有行然后再做一次提交).

代码有两个问题.

  1. 这很慢 - 大约20名学生每秒更新一次.

  2. 它甚至没有通过large_list_of_data,而是抛出一个说"无法打开数据库文件"的DatabaseError.(可能是因为我使用的是sqlite3.)

我的问题是:我怎样才能阻止这两件事发生?我猜这两个问题的根源是我有s.save()但是我没有看到一种方法可以轻松地将学生批处理,然后将它们保存在数据库的一次提交中.

database sqlite django django-models

4
推荐指数
1
解决办法
3360
查看次数