小编Mat*_*att的帖子

是否有一种简单的方法可以告诉alembic迁移到特定版本?

Alembic具有升级和降级到特定修订的命令,例如在命令行上:

alembic upgrade <target-revision>
Run Code Online (Sandbox Code Playgroud)

alembic downgrade <target-revision>
Run Code Online (Sandbox Code Playgroud)

如果您不知道是升级还是降级,是否有一种简单的方法可以迁移到特定修订版?即

alembic migrate <target-revision>
Run Code Online (Sandbox Code Playgroud)

我可以通过查看历史,当前和目标修订来确定方向,但这感觉就像打击图书馆一样.我是否遗漏了某些东西,或者有没有理由不提供开箱即用的东西?

database database-migration alembic

18
推荐指数
1
解决办法
7700
查看次数

Django 1.3日志记录:不记录500个错误

我正在努力使'django.request'记录器按照宣传的方式工作 - 500错误似乎没有传播给附加到它的处理程序.

在每个新项目的默认日志记录配置中,注释显示"此配置执行的日志记录是在每次HTTP 500错误时向站点管理员发送电子邮件".显然,只有在你正确设置ADMINS时才会发送电子邮件,但是当视图引发异常时我甚至都没有看到处理程序被调用.

我从一个空项目开始构建一个测试用例,并将自己的处理程序添加到'django.request'记录器中:

LOGGING = {
    'version': 1,
    'disable_existing_loggers': False,
    'handlers': {
        'mail_admins': {
            'level': 'ERROR',
            'class': 'django.utils.log.AdminEmailHandler'
        },
        'my_error_handler' : {
            'level': 'ERROR',
            'class': 'log.MyErrorHandler'
        }
    },
    'loggers': {
        'django.request': {
            'handlers': ['mail_admins', 'my_error_handler'],
            'level': 'ERROR',
            'propagate': True,
        },
    }
}
Run Code Online (Sandbox Code Playgroud)

处理程序本身:

import logging
class MyErrorHandler(logging.Handler):     
    def emit(self, record):
        print "handling error: %s" % record 
Run Code Online (Sandbox Code Playgroud)

如果我自己在记录器上调用.error(),一切正常.但是当视图生成500时,不会调用任何处理程序.我的views.py:

import logging

def home(request):

    #this error will be processed by MyErrorHandler
    logging.getLogger('django.request').error("Custom error message")

    #this won't
    raise Exception('500 error message') …
Run Code Online (Sandbox Code Playgroud)

django logging django-1.3

12
推荐指数
1
解决办法
5280
查看次数

RDBMS中有序列表最合适的数据结构?

我在MySQL数据库中存储了数百万项的有序列表.通常,需要在列表中添加或删除项目; 同样经常,必须确定项目列表中的位置.我会说读/写比率大约是50:50.

从链表模型开始,我阅读[1]和那里讨论的各种模型.对于严格的链表,邻接列表模型可以正常工作,但由于读/写比率或多或少相等,我采用标准连续列表进行分而治之:

将整个列表划分为近似长度的"桶"(比如~10000),保持桶大小的索引及其在主列表中的相对位置.每个项目都分配给一个特定的存储桶,并跟踪其在该存储桶中的位置.

通过这种方法,项目的位置是通过将列表中项目桶之前的桶的大小相加,然后在其自己的桶中添加项目的位置来确定的.要从列表中插入/删除项目,结果项目的"移位"将本地化到要添加或删除项目的存储区; 该桶的大小也必须相应更新.

在这种方法中存在一些非规范化(桶大小),即使对于事务,它也不具有本质上的线程安全性,因为在删除/插入期间必须查询项目表以确定要修改的项目的桶位置,然后更新以对该项目的存储桶中的所有其他项执行"移位".除非这些操作是原子的(通过存储过程可能?)线程始终是死锁.

是否有更复杂的方法将这种数据保存在RDBMS中?线程安全问题让我头痛不已,感觉应该有更好的方法来解决这个问题,而不是强迫我使用存储过程.

非常感谢,马特.

[1] 树数据结构的数据库结构

mysql database-design html-lists data-structures

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

为什么将stdin提供给subprocess.Popen会导致写入stdout的内容发生变化?

我正在使用Python的subprocess.Popen使用主机操作系统的二进制客户端执行一些FTP.由于各种原因,我无法使用ftplib或任何其他库.

如果我将stdin处理程序附加到Popen实例,则二进制文件的行为似乎会发生变化.例如,使用XP的ftp客户端,它接受要发出的命令的文本文件:

>>>from subprocess import Popen, PIPE  
>>>p = Popen(['ftp','-A','-s:commands.txt','example.com'], stdout=PIPE)  
>>>p.communicate()[0]  
'Connected to example.com.  
220 ProFTPD 1.3.1 Server (Debian) ...   
331 Anonymous login ok, send your complete email address as your password  
<snip>
ftp> binary  
200 Type set to I  
ftp> get /testfiles/100.KiB  
200 PORT command successful  
150 Opening BINARY mode data connection for /testfiles/100.KiB (102400 bytes)  
226 Transfer complete  
ftp: 102400 bytes received in 0.28Seconds 365.71Kbytes/sec.  
ftp> quit  
>>>
Run Code Online (Sandbox Code Playgroud)

commands.txt中:

binary  
get /testfiles/100.KiB  
quit  
Run Code Online (Sandbox Code Playgroud)

当还提供stdin时,stdout中的所有内容是:

>>>from subprocess import …
Run Code Online (Sandbox Code Playgroud)

python stdin subprocess stdout popen

6
推荐指数
2
解决办法
3669
查看次数

通过 Gmail API 发送电子邮件时,如何将“发件人”地址设置为域别名?

我正在通过 Python 中的 Gmail API 发送电子邮件,按照https://developers.google.com/gmail/api/v1/reference/users/messages/send#examples

我有一个域别名和收件箱设置,其中包含所有地址,因此发送到 nothing@sub.example.com 和anything@alias.example.com 的电子邮件最终都会出现在 tech@sub.example.com 的收件箱中。

tech@sub.example.com 和 tech@alias.example.com 在 Gmail 设置中都设置为“我拥有的帐户”,并且我在添加第二个帐户时无需验证其所有权(大概是因为它的域是别名)。

使用我正在处理的 API 处理收到的电子邮件,然后从它们被发送到的帐户重新发送它们,在 MIMEMessage 中设置“发件人”标头。不幸的是,它们总是从拥有邮箱的电子邮件地址收到。

其他问题(例如 [1]、[2])表明这应该“正常工作”,至少通过 SMTP,我也尝试过。我认为这一定是使用域别名的怪癖。

[1]通过 GMail 发送电子邮件时更改“发件人”地址

[2]如何将发件人地址设置为其他 gmail 中的任何电子邮件(通过 Gmail 在 .NET 中发送电子邮件)?

python email gmail alias gmail-api

5
推荐指数
0
解决办法
1661
查看次数

InfluxDB计算点之间的经过时间

我有一系列值来指定作业的状态,无论是成功还是失败。

系列中的每个项目都有一个类型以及一个分组ID。这是一个相关序列,因此如果作业成功bar,则ID 作业A将运行foo

idx time                    id     type    status
1   2018-01-01T00:00:00     A      foo     success
2   2018-01-01T01:00:00     A      bar     success
3   2018-01-02T00:00:00     B      foo     success
4   2018-01-02T02:00:00     B      bar     success
5   2018-01-03T00:00:00     C      foo     success
6   2018-01-03T03:00:00     C      bar     success
7   2018-01-04T00:00:00     D      foo     success
8   2018-01-04T01:00:00     D      bar     success
9   2018-01-05T00:00:00     E      foo     success
10  2018-01-05T01:00:00     E      bar     success
11  2018-01-06T00:00:00     F      foo     failure
12  2018-01-07T00:00:00     G      foo     failure
13  2018-01-08T00:00:00     H      foo     recovery
14 …
Run Code Online (Sandbox Code Playgroud)

influxdb

5
推荐指数
0
解决办法
781
查看次数