小编KRH*_*KRH的帖子

PostgreSQL空闲事务诊断和读取pg_locks

安装程序:多个Web服务器,运行mod_wsgi,Apache和pgbouncer,它们连接到运行Postgres 8.3.6的共享数据库.应用程序正在运行Django.

我们所看到的:"闲置在交易中"查询数据库已经挂了很长时间.为了看到它们,我会运行这样的事情:

SELECT query_start, procpid, client_addr, current_query FROM pg_stat_activity
WHERE query_start < NOW() - interval '5 minutes';
Run Code Online (Sandbox Code Playgroud)

大多数结果当然只是IDL连接,pgbouncer保持开放使用,但有时候会有这些旧的"IDLE in transaction"查询.我知道这意味着有一个查询事务正在等待某事,或者有一个BEGIN但没有达到COMMIT或ROLLBACK的事情.

我的下一步是尝试使用pg_locks来确定进程正在等待的内容:

select pg_class.relname, pg_locks.transactionid, pg_locks.mode,
       pg_locks.granted as "g", pg_stat_activity.current_query,
       pg_stat_activity.query_start,
       age(now(),pg_stat_activity.query_start) as "age",
       pg_stat_activity.procpid 
from pg_stat_activity,pg_locks
left outer join pg_class on (pg_locks.relation = pg_class.oid)  
where pg_locks.pid=pg_stat_activity.procpid
and pg_stat_activity.procpid = <AN IDLE TRANSACTION PROCESS>
order by query_start;
Run Code Online (Sandbox Code Playgroud)

很多时候,我得到的结果看起来像这样:

 relname | transactionid |      mode       | g |     current_query     |         query_start          |       age       |  client_addr   | procpid 
---------+---------------+-----------------+---+-----------------------+------------------------------+-----------------+----------------+---------
         |               | AccessShareLock | …
Run Code Online (Sandbox Code Playgroud)

postgresql

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

Django对象创建和Postgres序列

我有一个导入脚本,它运行一系列命令,从一个Postgres DB到另一个,从而运行相同的Django代码库.在大多数情况下,它使用./manage.py loaddata进行复制,但有些对象需要额外的处理,我在自定义脚本中使用Django的objects.create()方法来复制数据.这样做时,我指定ID,即

MyObject.objects.create(id = 2, title = 'foo')
Run Code Online (Sandbox Code Playgroud)

一旦脚本完成,我注意到Postgres SEQUENCE在我执行objects.create()的表上是错误的.即,在导入之前它是50,并且仍然是50之后,即使该表现在有150个对象.当然,这会在创建新对象时导致错误,因为它会尝试使用已存在的ID(在所有这些表中,ID只是一个vanilla自动增量字段).但是,通过./manage.py loaddata填充的表似乎很好.

我知道我可以用Django的./manage.py sqlsequenreset手动重置这些表,但我很好奇为什么序列似乎首先出现了问题.objects.create()不会增加它吗?我忽略了一些明显的东西吗

django postgresql

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

使用内联formset和Model表单在Admin中进行表单验证

我有一个模型,OrderedList,它是一个用户订购的内容对象的列表.OrderedList有几个属性,包括它所属的站点.

内容对象通过OrderedListRow类附加到它上面,该类通过admin中的内联formset进入OrderedList的管理员.

class OrderedList(GenericList):

    objects = models.Manager()
    published = GenericListManager()

class OrderedListRow(models.Model):

    list = models.ForeignKey(OrderedList)
    content_type = models.ForeignKey(ContentType)
    object_id = models.PositiveSmallIntegerField()
    content_object = generic.GenericForeignKey("content_type", "object_id")
    order = models.IntegerField('order', blank = True, null = True)
Run Code Online (Sandbox Code Playgroud)

(OrderedList从较大的GenericList摘要继承站点字段).

这是我的问题; 当用户保存管理表单时,我想验证每个OrderedListRow映射到的每个内容对象属于OrderedList所执行的同一站点(该列表只能属于1个站点;内容对象可以属于多个).

我可以覆盖OrderedList的管理表单的clean(),但它不包含包含OrderedListRows的内联formset,因此它无法访问该数据.我可以覆盖OrderedListRows的内联formset的干净,但它无法到达列表.我需要在表单验证的上下文中使用某种方式来访问OrderedList的表单数据和表单集的表单数据,这样我就可以针对OrderedList的站点检查OrderedListRow的内容对象的所有站点,如果出现问题则抛出验证错误.到目前为止,我还没有找到包含OrderedRow和OrderedListRows的清理数据的函数.

python django django-forms django-admin

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

标签 统计

django ×2

postgresql ×2

django-admin ×1

django-forms ×1

python ×1