代码之家  ›  专栏  ›  技术社区  ›  Ben

在调用SQLite的python中,如何通过名称引用列?

  •  12
  • Ben  · 技术社区  · 17 年前

    我有一些用于查询MySQL的代码,我希望将其用于SQLite。我真正的希望是,这不会涉及对代码进行太多更改。不幸的是,以下代码不适用于SQLite:

    cursor.execute(query)
    
    rows = cursor.fetchall()
    
    data = []
    for row in rows
      data.append(row["column_name"])
    

    这会产生以下错误:

     TypeError: tuple indices must be integers
    

    然而,如果我将引用更改为使用列编号,则它可以正常工作:

      data.append(row[1])
    

    我是否可以按列名称引用列的方式执行查询?

    7 回复  |  直到 14 年前
        1
  •  28
  •   dotancohen schneck    12 年前

    在提出并回答该问题的五年中,出现了一个非常简单的解决方案。任何新代码都可以简单地用行工厂包装连接对象。代码示例:

    import sqlite3
    
    conn = sqlite3.connect('./someFile')
    conn.row_factory = sqlite3.Row        // Here's the magic!
    
    cursor = conn.execute("SELECT name, age FROM someTable")
    for row in cursor:
        print(row['name'])
    

    这里有一些 fine docs . 享受

        2
  •  16
  •   Richard Levasseur    17 年前

    要按名称访问列,请使用 row_factory 连接实例的属性。它允许您设置一个接受参数的函数 cursor row sqlite3.Row ,它符合您的要求。

        3
  •  13
  •   kquinn    17 年前

    cursor.execute("""SELECT foo, bar, baz, quux FROM table WHERE id = %s;""", 
                      (interesting_record_id,))
    
    for foo, bar, baz, quux in cursor.fetchall():
        frobnicate(foo + bar, baz * quux)
    

    查询格式化方法是DB-API标准之一,但恰好是Psycopg2的首选方法;其他DB-API适配器可能会建议使用不同的约定,这样就可以了。

    比记住数字列ID更好。

    这种风格也有助于避免 SELECT * FROM table... ,这对于最简单的表和查询之外的任何东西来说都是一场维护灾难。

    所以,这不完全是你想要的答案,但可能会有所启发。

        4
  •  12
  •   chaimp    15 年前

    这可以通过在“连接”状态后添加一行来完成:

    conn.row_factory = sqlite3.Row
    

    http://docs.python.org/library/sqlite3.html#accessing-columns-by-name-instead-of-by-index

        5
  •  2
  •   LittleBobbyTables - Au Revoir    14 年前

    库沙尔的回答 this forum 工作正常:

    使用光标:

    import MySQLdb.cursors
    
    .
    .
    .
    cursor = db.cursor (MySQLdb.cursors.DictCursor)
    cursor.execute (query)
    rows = cursor.fetchall ()
    
    for row in rows:
    print row['employee_id'] 
    

    请注意,列名区分大小写。

        6
  •  1
  •   Christian Witts    17 年前

    headers = {}
    for record in cursor.fetchall():
        if not headers:
            headers = dict((desc[0], idx) for idx,desc in cursor.description))
        data.append(record[headers['column_name']])
    

    有点啰嗦,但完成了任务。我注意到他们甚至在dict_factory下的factory.py文件中有它。

        7
  •  0
  •   svenema    7 年前

    rows = c.fetchall()
    for row in rows:
        for col_i, col in enumerate(row):   
            print("Attribute: {0:30} Value: {1}".format(c.description[col_i][0],col))