在我的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方法访问产品对象的属性,这是否可能?
先谢了。
4条答案
按热度按时间vsikbqxv1#
pscycopg2 NamedTupleCursor为数据库结果提供对象。
n6lpvg4x2#
sqlite3
有一个内置的方法来完成此操作:https://docs.python.org/3.8/library/sqlite3.html#sqlite3.Row
Row示例充当Connection对象的高度优化的row_factory,它试图在大部分特性中模仿元组。
它支持通过列名和索引进行Map访问、迭代、表示、相等性测试和len()。
如果两个Row对象具有完全相同的列,并且它们的成员相等,则它们比较起来相等。
按键()
此方法返回列名列表。在查询之后,它是Cursor.description中每个元组的第一个成员。
所以在你的例子中:
或者您可以构建自己的:
https://docs.python.org/3.8/library/sqlite3.html#connection-objects
行工厂
您可以将此属性更改为一个可调用对象,该对象将游标和原始行作为元组接受,并将返回实际结果行。这样,您就可以实现更高级的返回结果的方法,例如返回一个也可以按名称访问列的对象。
y3bcpkx13#
好吧,我想再找一找就知道怎么做了。
不确定这是不是最好的方法,但对我来说很有效。
Convert database result into json以及convert json to python object.
evrscar24#
在将sqlite3转换为psychopg3时,我也遇到了这个问题(通过索引而不是列名访问),我发现RowFactories的概念非常有用。
显然,在sqlite3中,默认通过 * column name * 访问字段,但在psychopg3中,只能通过 * index * 访问字段。需要注意的是,index = 0表示数据记录的编号,而不是第一个字段。
示例:
如果您为连接(或游标)提供了一个额外的参数"row_factory",那么列名将被正确地设置为键名。
示例:
从数据类导入数据类
Python对象也可以在那里创建(@dataclass/class_row),如果内置的行工厂不够,可以提供自己的行工厂实现。