【问题标题】:Set Sqlite query results as variables [duplicate]将Sqlite查询结果设置为变量[重复]
【发布时间】:2018-07-19 11:28:28
【问题描述】:

问题:

嗨,现在我正在查询 sqlite 并将结果分配给如下变量:

表结构: rowid、名称、某事

cursor.execute("SELECT * FROM my_table WHERE my_condition = 'ExampleForSO'")
found_record = cursor.fetchone()

record_id = found_record[0]
record_name = found_record[1]
record_something = found_record[2]
print(record_name)

但是,很可能有一天我必须在表格中添加一个新列。我们以添加该列为例:

表结构: rowid、年龄、姓名、某事

在那种情况下,如果我们运行相同的代码,namesomething 将被错误分配,打印出来的不是名字而是年龄,所以我必须手动编辑代码以适应当前指数。但是,我现在正在为一个复杂的 UI 处理超过 100 个字段的表,这样做很烦人。


期望的输出:

我想知道是否有更好的方法通过使用 dicts 或类似的东西来捕获结果:

潜伏者注意:下一段是编造的代码不起作用,不要使用它。

cursor.execute_to(my_dict, 
                  '''SELECT rowid as my_dict["id"], 
                     name as my_dict["name"], 
                     something as my_dict["something"] 
                     FROM my_table WHERE my_condition = "ExampleForSO"''')

print(my_dict['name'])

我可能对这种方法有误,但这与我想要的很接近。这样,如果我不将结果作为索引访问,并且如果添加一个新列,无论它在哪里,输出都是相同的。

实现它的正确方法是什么?还有其他选择吗?

【问题讨论】:

  • “但是,我现在正在处理包含 100 多个字段的复杂 UI 表”=> 你可能想要使用一些轻量级的 ORM(例如 peewee)。

标签: python python-3.x sqlite


【解决方案1】:

你可以使用namedtuple,然后在sqlite中指定connection.row_factory。示例:

import sqlite3
from collections import namedtuple

# specify my row structure using  namedtuple
MyRecord = namedtuple('MyRecord', 'record_id record_name record_something')

con = sqlite3.connect(":memory:")
con.isolation_level = None
con.row_factory = lambda cursor, row: MyRecord(*row)

cur = con.cursor()

cur.execute("CREATE TABLE my_table (record_id integer PRIMARY KEY, record_name text NOT NULL, record_something text NOT NULL)")
cur.execute("INSERT INTO my_table (record_name, record_something) VALUES (?, ?)", ('Andrej', 'This is something'))
cur.execute("INSERT INTO my_table (record_name, record_something) VALUES (?, ?)", ('Andrej', 'This is something too'))
cur.execute("INSERT INTO my_table (record_name, record_something) VALUES (?, ?)", ('Adrika', 'This is new!'))

for row in cur.execute("SELECT * FROM my_table WHERE record_name LIKE 'A%'"):
    print(f'ID={row.record_id} NAME={row.record_name} SOMETHING={row.record_something}')

con.close()

打印:

ID=1 NAME=Andrej SOMETHING=This is something
ID=2 NAME=Andrej SOMETHING=This is something too
ID=3 NAME=Adrika SOMETHING=This is new!

【讨论】:

  • 正是我需要的。谢谢。
猜你喜欢
  • 1970-01-01
  • 2016-04-18
  • 2021-02-11
  • 2014-06-03
  • 1970-01-01
  • 2012-06-28
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多