在Python 3中将数据库查询结果存储在对象中

wn9m85ua  于 2023-02-14  发布在  Python
关注(0)|答案(4)|浏览(317)

在我的python应用程序中,我运行了一个查询,它从我的product表中返回了一个product。当我得到结果并将其赋给一个变量时,它被存储在一个list中。但是我想创建一个product class,并将查询结果存储在我的product class的一个对象中,该对象与我的数据库表匹配。
但是我不想用这种方式,一个接一个地从列表中获取值,设置对象变量等等。
我想这样做,因为我的数据库表很大,列表不存储变量的字段名。所以我不能用这样东西getProductName()

[5,"strawberry",011023234,10.5]

所以我应该记住在哪个位置我的产品条形码存储时,它是需要的。
从数据库中检索数据;

vt = sqlite3.connect("vt.sqlite")
im = vt.cursor()
im.execute("SELECT * FROM Products WHERE barcode='{}'".format(barcode))
veriler = im.fetchall()

这里是veriler = [5,"starberry",001]
我的数据库表会很大,那么我的验证器会是一个很长的列表。
当我想获取检索数据的一些属性时,我必须访问它,如veriler [0],veriler [25]等。我应该记住每个属性的索引。
如果我有一个产品类,它包含数据库表中的所有属性,并创建一个产品对象,当我将数据库结果分配给产品对象时,我已经设置了产品对象中的所有属性,并可以使用get方法访问产品对象的属性,这是否可能?
先谢了。

vsikbqxv

vsikbqxv1#

pscycopg2 NamedTupleCursor为数据库结果提供对象。

n6lpvg4x

n6lpvg4x2#

sqlite3有一个内置的方法来完成此操作:
https://docs.python.org/3.8/library/sqlite3.html#sqlite3.Row
Row示例充当Connection对象的高度优化的row_factory,它试图在大部分特性中模仿元组。
它支持通过列名和索引进行Map访问、迭代、表示、相等性测试和len()。
如果两个Row对象具有完全相同的列,并且它们的成员相等,则它们比较起来相等。
按键()
此方法返回列名列表。在查询之后,它是Cursor.description中每个元组的第一个成员。
所以在你的例子中:

vt = sqlite3.connect("vt.sqlite")
vt.row_factory = sqlite3.Row

或者您可以构建自己的:
https://docs.python.org/3.8/library/sqlite3.html#connection-objects
行工厂
您可以将此属性更改为一个可调用对象,该对象将游标和原始行作为元组接受,并将返回实际结果行。这样,您就可以实现更高级的返回结果的方法,例如返回一个也可以按名称访问列的对象。

Example:

import sqlite3

def dict_factory(cursor, row):
    d = {}
    for idx, col in enumerate(cursor.description):
        d[col[0]] = row[idx]
    return d

con = sqlite3.connect(":memory:")
con.row_factory = dict_factory
cur = con.cursor()
cur.execute("select 1 as a")
print(cur.fetchone()["a"])

con.close()
y3bcpkx1

y3bcpkx13#

好吧,我想再找一找就知道怎么做了。
不确定这是不是最好的方法,但对我来说很有效。
Convert database result into json以及convert json to python object.

evrscar2

evrscar24#

在将sqlite3转换为psychopg3时,我也遇到了这个问题(通过索引而不是列名访问),我发现RowFactories的概念非常有用。
显然,在sqlite3中,默认通过 * column name * 访问字段,但在psychopg3中,只能通过 * index * 访问字段。需要注意的是,index = 0表示数据记录的编号,而不是第一个字段。
示例:

{0:0, : 1: 'John Doe', 2: 'age'}

如果您为连接(或游标)提供了一个额外的参数"row_factory",那么列名将被正确地设置为键名。
示例:

from psycopg.rows import namedtuple_row
...
cur = connection.cursor(row_factory=namedtuple_row)

{'name': 'John Doe', 'age': 33}

从数据类导入数据类
Python对象也可以在那里创建(@dataclass/class_row),如果内置的行工厂不够,可以提供自己的行工厂实现。

相关问题