将数据库记录拆分为变量

split database record into variables

我有一个功能可以在数据库中搜索 id code/name 匹配的行,然后加载记录

例如[(1, 'John', 'Smith', 30)]

我正在使用 python 以及如何将此列表拆分为单独的变量

例如

ID = 1
Firstname = John
Surname = Smith
Age = 30

抱歉,我是新手,实现起来可能非常简单。

这是我目前拥有的:

def find():
   cursor = db.cursor()

   searchname = str(input('Enter name of product: '))
   sql = "SELECT * FROM items WHERE name = '%s';" % searchname.strip()
   cursor.execute(sql)
   a = cursor.fetchall()


   print(a)
   row = a 

感谢您花时间提供帮助:)

假设您使用的是 sqlite3,它内置了 a nifty row factory,让您可以像访问字典一样访问行,以列名作为键:

# right after connect
db.row_factory = sqlite3.Row

def find():
    cursor = db.cursor()
    searchname = str(input('Enter name of product: '))
    sql = "SELECT * FROM items WHERE name = '%s';" % searchname.strip()
    cursor.execute(sql)
    a = cursor.fetchall()
    for row in a:
        print(row['ID'])

我知道这不是您真正想要的,但通常是您想要的Creating variables dynamically is a bad idea。不过,如果您真的想这样做,答案与将任何映射转储到本地范围内一样,如果需要,您可以搜索本地范围。


如果您更喜欢属性式访问(如 a.ID)而不是字典式访问(如 a['ID']),那很简单。 (但请记住,并非每个有效的 SQL 列名都是有效的 Python 标识符!)

最有效的方法可能是从 description:

中创建一个 namedtuple
row_type = namedtuple('row', [col.name for col in cursor.description])
for row in map(row_type._make, a):
    print(row.ID)

如果您使用的是 MySQL,我不知道是否有任何 MySQL 库提供了 Row 的等价物,但使用游标的 description 属性,就像我们用它构建 namedtuple 一样。例如:

for row in a:
    drow = {cursor.description[i].name: row[i] for i in range(len(row))}
    print(row['ID'])

不同于特定于sqlite3的特殊Row工厂,the DB-API 2.0 spec需要Cursor.description