python - 将 Sqlite 查询结果设置为变量
问题描述
问题:
嗨,现在我正在查询 sqlite 并将结果分配给如下变量:
表结构: rowid、name、something
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、age、name、something
在那种情况下,如果我们运行相同的代码,name
并且something
会被错误地分配并且打印不会给我名字而是年龄,所以我必须手动编辑代码以适应当前索引。但是,我现在正在为一个复杂的 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'])
我可能对这种方法有误,但这与我想要的很接近。这样,如果我不将结果作为索引访问,并且如果添加一个新列,无论它在哪里,输出都是相同的。
实现它的正确方法是什么?还有其他选择吗?
解决方案
您可以使用namedtuple
然后connection.row_factory
在 sqlite 中指定。例子:
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!
推荐阅读
- r - 比较两列的匹配值并并排对齐
- compiler-errors - C++ 从“int”到“int*”的无效转换
- loopbackjs - 是否可以在远程挂钩中执行 models.find() ?
- facebook - 如何在生产 Facebook 页面中进行测试,测试数据仅显示给应用程序的测试人员
- c - if 语句中的逻辑运算符
- c - 将字符串数组添加到c中的字符指针
- html - 为什么 display:inline-block 对齐不符合预期
- tensorflow - 如何使用 tensorflow 1.14 为 keras 层定义自定义渐变
- excel - How to detect 3 consecutive empty rows in excel
- javascript - 注册 ServiceWorker 时如何修复 404 错误?