SELECT查询在MySQL Python中是否具有返回类型?

时间:2013-11-14 11:23:40

标签: python mysql mysql-python

我想使用SELECT查询检查数据库中是否存在特定行;如果它不存在我想用另一个查询INSERT INTO数据库,如果它确实存在我不希望发生任何事情。

我正在考虑在Python中使用if语句来处理上面的场景,但我似乎无法确定SELECT查询是否会返回True,False等,如果SELECT没有找到该行。

*** PS。我使用MySQLdb

   def _query (self, query):
     cursor = self.db.cursor()
     cursor.execute (query)
     return cursor`

      for k,v in sorted(config.items()):

    #checking for duplicate values

    check_items_table = "SELECT * FROM items WHERE text = ('%s') AND name = ('%s')" % \
    (str (k), str (v))
    self._query (check_items_table)

    if check_items_table == <True or False or Something>:

      #do nothing

    else:

      #insert into items table

      items_table = "INSERT INTO items(item_id, \
      name, text) \
      VALUES (null,'%s', '%s')" % \
      (str (k), str (v))
      self._query (items_table)

1 个答案:

答案 0 :(得分:2)

您正在使用符合DB-API 2.0的MySQLdb。

您正在调用execute,然后返回Cursor对象。

游标具有属性rowcount,但在某些数据库模块中,仅为INSERTUPDATE等修改查询设置,而不是SELECT,而在其他模块中,它仅在您执行fetch*操作后设置。 (我相信MySQLdb是后者之一,但我并不积极。)

所以,你想要的是调用fetchone方法。如果它返回一行,则该行存在;如果它引发异常,则该行不存在。


或者,您可以SELECT COUNT(*) FROM …而不是选择行本身。然后保证fetchone返回一行,其中一个值为0或1。


但是,我不确定你是否想要以这种方式做事。通常,最好在列(或列)上创建唯一约束,因此数据库不允许存在两行,并且该列具有相同的值。然后,您只能INSERT该行,如果它已经存在,您将收到错误;根本不需要SELECT。 (或者,如果您不需要知道它是否已存在,则可以使用INSERT IGNORE,这是特定于MySQL的。)


与此同时,扩大我的注意事项:

动态构建SQL字符串总是一个坏主意,如下所示:

items_table = "INSERT INTO items(item_id, \
      name, text) \
      VALUES (null,'%s', '%s')" % \
      (str (k), str (v))

这使您对SQL injection开放,迫使您处理繁琐的引用/转义/类型转换问题,并阻止数据库意识到您重复运行相同的查询。

使用参数化语句。像这样:

items_table = "INSERT INTO items(item_id, \
      name, text) \
      VALUES (null, %s, %s)"

请注意,我没有引用%s,并且我没有使用%运算符。值将发送到execute语句:

cursor.execute(items_table, (k, v))

因此,您只需要像这样更新_query包装:

def _query(self, query, parameters=[]):
     cursor = self.db.cursor()
     cursor.execute(query, parameters)
     return cursor

...你可以这样称呼它:

self._query(items_table, (k, v))