【问题标题】:Django raw query returns no rows, when SQL does当 SQL 执行时,Django 原始查询不返回任何行
【发布时间】:2014-08-07 16:35:41
【问题描述】:

我的头要撞到墙上了。

考虑以下代码:

def get_cardnumbers_from_timestamp(request, since_time=0):
    if request.method == 'GET':
        if request.user:
            if not request.user.is_authenticated():
                logger.debug('User is not authorized')
                return auth_required('Authentication required')

        logger.debug('User has been authorized')
        user = request.user
        logger.debug('since_time: {0}'.format(since_time))
        if int(since_time) != 0:
            utc_time = time.mktime(time.gmtime(int(since_time)))
        else:
            utc_time = 0

        logger.debug('since_time UTC: {0}'.format(utc_time))

        devices_data = dict()
        from django.db import connection

        cursor = connection.cursor()
        query = 'SELECT c.name,c.id,d.locale,d.card_number,d.dev_uniqid,d.id FROM device_channel dc JOIN channels c on dc.channel_id = c.id JOIN devices d on dc.device_id=d.id WHERE d.card_number IS NOT NULL AND updated >= FROM_UNIXTIME({time}) ORDER BY d.id'.format(time=int(utc_time))
        logger.debug(query)
        cursor.execute(query)
        answers = cursor.fetchall()
        cursor.close()
        logger.debug(answers)

当使用since_time 明确设置为0 或根本未设置对 MySQL 触发时,形成的查询返回大约 250 行,Django 也是如此。

但是,当我将时间戳设置为某个值时,无论哪个相同格式的查询(我记录然后从日志中复制粘贴)在 M​​ySQL 控制台中返回 5 行都无关紧要。 Django 给了我一个高达0 的结果集。

我可能忽略了一些非常明显的事情,但我已经尝试了很多方法,但都无济于事。

欢迎提出任何想法。

【问题讨论】:

  • 你是否在 mysql 控制台中运行过相同的查询?
  • @dhana:这正是我的问题所说的 - MySQL 给了我结果,Django 没有:)
  • 我有同样的问题 :(。我的查询在 SQL gui 中工作,但完全相同的查询在 django 原始查询中不起作用

标签: sql django mysql-python


【解决方案1】:

您不应将参数传递给具有字符串格式的 django 原始查询,而应将它们传递给执行(另请检查 docs)。例如,在你的情况下这样做:

查询 = """ 选择 c.name,c.id,d.locale,d.card_number,d.dev_uniqid,d.id FROM device_channel dc 在 dc.channel_id = c.id 上加入通道 c 在 dc.device_id=d.id 上加入设备 d WHERE d.card_number 不为 NULL 且已更新 >= FROM_UNIXTIME(%s) 由 d.id 订购 """ cursor.execute(查询,[int(utc_time)])

【讨论】:

  • 也试过了。一样的效果。没有结果 :(
  • 嗯,虽然.. 我尝试的时候可能有点偏离轨道。我现在刚刚重新尝试了您的方法,它确实有效.. 谢谢伙计!
【解决方案2】:

默认情况下,Python DB API 将返回不带字段名称的结果,这意味着您最终会得到一个值列表,而不是一个字典。以较低的性能成本,您可以使用以下内容将结果作为 dict 返回:

def dictfetchall(cursor):
    "Returns all rows from a cursor as a dict"
    desc = cursor.description
    return [
        dict(zip([col[0] for col in desc], row))
        for row in cursor.fetchall()
    ]

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2017-04-08
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-11-16
    • 2017-10-08
    • 2010-11-01
    相关资源
    最近更新 更多