通过游标从 mySQL 中选择记录返回 None 对象

Posted

技术标签:

【中文标题】通过游标从 mySQL 中选择记录返回 None 对象【英文标题】:Selecting record from mySQL via cursors returns an None object 【发布时间】:2018-10-01 08:43:54 【问题描述】:

我正在使用 mysqlconnector 在 python 3.x 中编写脚本。 我现在想要实现的是检查我的数据库中是否有一条记录,这可能与我现在正在分析的记录重复。 我想出了这样的代码:

def fill_data(self, db_name, data):
    cursor = self.cnx.cursor(buffered=True)
    isDuplicate = cursor.execute(("SELECT destination FROM 0 WHERE destination = '1';")
                                 .format(db_name, data['destination']))

    print(cursor.statement)
    self.commit()
    print(isDuplicate is None)

虽然我仍然得到 isDuplicate as None 对象。我试图通过 cursor.statement 检查正在传递给我的数据库的语句:结果是,在脚本中我得到 None obj 而在数据库中传递时,查询工作正常。 我还尝试了 SELECT COUNT(1) FROM db_name,这也给了我不同的结果。

我没有想法:也许你们可以帮助我?

更新:

对我有用的解决方案是:

    q = ("SELECT * FROM 0 WHERE destination = %s AND countryCode = %s AND prefix = %s")
.format(db_name)
    cursor.execute(q, (data['destination'], data['country_code'], data['prefix']))
    self.cnx.commit()
    isDoubled = cursor.fetchone()

所以归根结底就是从游标中获取数据:)

【问题讨论】:

【参考方案1】:

也许你的问题的原因是你使用execute()method的方式。

尝试进行一些更改,看看打印出来的内容:

def fill_data(self, db_name, data):
    cursor = self.cnx.cursor(buffered=True)
    q = 'SELECT count(*) FROM  WHERE destination = %s'.format(db_name)
    duplicate_count = cursor.execute(q, (data['destination'], )).fetchall()
    print(duplicate_count)

Why should I provide query parameters this way?(文章在psql,但核心原理与mysql相同)


更新

如果您仍然收到"NoneType" object has no atribute "fetchall",那么错误可能就在这里:

cursor = self.cnx.cursor(buffered=True)

看起来你根本没有创建cursor。如果您发布一些有关cnx 创建的代码,我可以看看它。

【讨论】:

不幸的是,这并没有改变任何东西。更重要的是:我不知道我是否理解您在这里尝试做的事情,但是您应该在 format() 方法中传递 data['destination'] 而不是 db_name 。两种方式(你的或我的改变参数)都没有改变,除了现在我得到 AttributeError 因为“NoneType”对象没有属性“fetchall” .format 正常工作 - %s 在这里没有使用,它在 execute 方法中使用。你可以print(q) 看看我的意思。我将添加一个很好的文档链接,关于在查询中提供参数以及我对NoneType 的想法。 关于您的更新:我不可能不在该行创建游标,因为我稍后在同一函数中使用相同的游标对象向我的数据库添加条目。我现在没有工作,但如果你坚持,我可以在星期一向你展示初始化 :) 这很奇怪。好的,把完整的代码贴出来我看看

以上是关于通过游标从 mySQL 中选择记录返回 None 对象的主要内容,如果未能解决你的问题,请参考以下文章

MySQL游标存储过程条件显示重复记录

MySQL游标(cursor) 定义及使用

MySQL高级篇-游标

MYSQL 游标学习及使用实例

快进来,详解MySQL游标

mysql存储过程group_concat为游标中的选择返回null