MySQLdb中的Python foreach

2024-06-16 11:17:33 发布

您现在位置:Python中文网/ 问答频道 /正文

我试图用Python获取MySQL中的时间戳列表。一旦我有了清单,我现在就检查时间,并检查哪些时间比15分钟前长。一旦我有了这些,我真的想要一个最终的总数。这似乎比我原先认为的更具挑战性。在

所以,我用这个从MySQL获取列表:

db = MySQLdb.connect(host=server, user=mysql_user, passwd=mysql_pwd, db=mysql_db, connect_timeout=10)
cur = db.cursor()
cur.execute("SELECT heartbeat_time FROM machines")
row = cur.fetchone()
print row
while row is not None:
    print ", ".join([str(c) for c in row])
    row = cur.fetchone()
cur.close()
db.close()

>> 2016-06-04 23:41:17
>> 2016-06-05 03:36:02
>> 2016-06-04 19:08:56

这是我用来检查它们是否比15分钟前长的片段:

^{pr2}$

但我不知道我怎么能把这些结合起来。另外,既然我把它写下来了,一定有一个更简单/更好的方法来过滤这些?在

谢谢你的建议!在


Tags: 列表closedbconnect时间mysqlrowprint
2条回答

您可以将15分钟的检查直接合并到SQL查询中。这样,就不需要再纠结于时间戳了,而且在我看来,读代码要容易得多。在

如果需要表格中其他列的日期:

select * from machines where now() > heartbeat_time + INTERVAL 15 MINUTE;

如果您只对总数感兴趣:

SELECT count(*) FROM machines WHERE NOW() > heartbeat_time + INTERVAL 15 MINUTE;

这样你就可以当前取款()并获取None或tuple,其中第一个值是时间戳早于15分钟的行数。在

对于迭代resultset,它应该足够编写

cur.execute('SELECT * FROM machines')
for row in cur:
    print row

因为基游标的行为已经类似于使用.fetchone()的迭代器。在

(假设您的数据库中有您在问题中所述的时间戳)

@user5740843:if str(result) >= 15:将无法按预期工作。因为True,所以它总是True。在

我假设heartbeat_time字段是日期时间字段。在

import datetime
import MySQLdb
import MySQLdb.cursors

db = MySQLdb.connect(host=server, user=mysql_user, passwd=mysql_pwd, db=mysql_db, connect_timeout=10,
                     cursorclass=MySQLdb.cursors.DictCursor)
cur = db.cursor()

ago = datetime.datetime.utcnow() - datetime.timedelta(minutes=15)
try:
    cur.execute("SELECT heartbeat_time FROM machines")
    for row in cur:
        if row['heartbeat_time'] <= ago:
            print row['heartbeat_time'], 'more than 15 minutes ago'
finally:
    cur.close()
    db.close()

如果数据大小不是那么大,那么将它们全部加载到内存是一个很好的做法,这将释放MySQL服务器上的内存缓冲区。而对于DictCursor来说

^{pr2}$

以及

for r in cur:

它们都将数据加载到客户端。MySQLdb.SSCursorSSDictCursor将根据需要尝试传输数据,而它需要MySQL服务器支持。在

相关问题 更多 >