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)
我可以通过查看历史,当前和目标修订来确定方向,但这感觉就像打击图书馆一样.我是否遗漏了某些东西,或者有没有理由不提供开箱即用的东西?
我正在努力使'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) 我在MySQL数据库中存储了数百万项的有序列表.通常,需要在列表中添加或删除项目; 同样经常,必须确定项目列表中的位置.我会说读/写比率大约是50:50.
从链表模型开始,我阅读[1]和那里讨论的各种模型.对于严格的链表,邻接列表模型可以正常工作,但由于读/写比率或多或少相等,我采用标准连续列表进行分而治之:
将整个列表划分为近似长度的"桶"(比如~10000),保持桶大小的索引及其在主列表中的相对位置.每个项目都分配给一个特定的存储桶,并跟踪其在该存储桶中的位置.
通过这种方法,项目的位置是通过将列表中项目桶之前的桶的大小相加,然后在其自己的桶中添加项目的位置来确定的.要从列表中插入/删除项目,结果项目的"移位"将本地化到要添加或删除项目的存储区; 该桶的大小也必须相应更新.
在这种方法中存在一些非规范化(桶大小),即使对于事务,它也不具有本质上的线程安全性,因为在删除/插入期间必须查询项目表以确定要修改的项目的桶位置,然后更新以对该项目的存储桶中的所有其他项执行"移位".除非这些操作是原子的(通过存储过程可能?)线程始终是死锁.
是否有更复杂的方法将这种数据保存在RDBMS中?线程安全问题让我头痛不已,感觉应该有更好的方法来解决这个问题,而不是强迫我使用存储过程.
非常感谢,马特.
[1] 树数据结构的数据库结构
我正在使用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 中的 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,我也尝试过。我认为这一定是使用域别名的怪癖。
我有一系列值来指定作业的状态,无论是成功还是失败。
系列中的每个项目都有一个类型以及一个分组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)