繁体   English   中英

python / sqlite3:sqlite3无法正确处理具有相同名称的多个列

[英]python/sqlite3: multiple columns with the same name not correctly treated by sqlite3.Row

我正在访问从我的手机(特别是从gnucash应用程序)获取的sqlite数据库。 我想按名称访问列,因此在连接上设置conn.row_factory = sqlite3.Row。 然后,使用以下查询连接两个表:

>>> rows = curr.execute('select * from splits s left join transactions t on s.transaction_uid = t.uid')

列名已正确报告,但没有表别名:

>>> row = rows.fetchone()
>>> print(row.keys())
['_id', 'uid', 'memo', 'type', 'value_num', 'value_denom', 'quantity_num', 'quantity_denom', 'account_uid', 'transaction_uid', 'created_at', 'modified_at', '_id', 'uid', 'name', 'description', 'timestamp', 'is_exported', 'is_template', 'currency_code', 'scheduled_action_uid', 'created_at', 'modified_at', 'commodity_uid']

因此,当我访问值时,重复列将获得相同的值:

>>> for k in row.keys():
...   print(k, row[k])
...
_id 3690
uid a93bf33079924d82afcca4fd6acc0823
memo None
type CREDIT
value_num 1882.9999999999998
value_denom 100
quantity_num 1882.9999999999998
quantity_denom 100
account_uid sbilancio-e966169c8dfe
transaction_uid 2ad90ed9766b4716b8e443c8c19b35a0
created_at 2015-11-03 13:55:03
modified_at 2015-11-03 13:55:03
_id 3690
uid a93bf33079924d82afcca4fd6acc0823
name Sbilancio
description 
timestamp 1412340295000
is_exported 0
is_template 0
currency_code EUR
scheduled_action_uid None
created_at 2015-11-03 13:55:03
modified_at 2015-11-03 13:55:03
commodity_uid None

_id,uid,created_at和modified_at的值来自SPLITS,而TRANSACTIONS的值不可用。

您可能会告诉我,我不应该使用“ SELECT *”,但这不能解决问题:

>>> rows = curr.execute('select s._id, t._id from splits s left join transactions t on s.transaction_uid = t.uid where s._id = 3758')
>>> row = rows.fetchone()
>>> print(row.keys())
['_id', '_id']
>>> for k in row.keys():
...   print(k, row[k])
... 
_id 3758
_id 3758

幸运的是,在使用列别名时,它可以工作:

>>> rows = curr.execute('select s._id s_id, t._id t_id from splits s left join transactions t on s.transaction_uid = t.uid where s._id = 3758')
>>> row = rows.fetchone()
>>> print(row.keys())
['s_id', 't_id']

您会将此行为视为错误吗? 在这种情况下,您对sqlite3会有什么期望? 我认为,如果给定表别名,则应将它们放在列名的前面,否则应抛出sqlite3.OperationalError异常,就像查询中的语法错误一样。 还有其他想法吗?

文件说:

结果列的名称是该列的“ AS”子句的值(如果存在AS子句)。 如果没有AS子句,则未指定列的名称。

因此,当一行中有两列碰巧具有相同的名称时,就无法通过它们的名称来访问它们两者。 Python应该如何知道row['_id']row['_id']应该不同?

您要么必须显式重命名某些列,要么按它们的位置( row[0]row[1] )访问行值。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM