gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-12-03 18:09:08 24 4
gpt4 key购买 nike

我正在访问从手机(特别是从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异常,就像查询中的语法错误一样。还有其他想法吗?

最佳答案

documentation说:


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


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

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

关于python - python/sqlite3:sqlite3无法正确处理具有相同名称的多个列,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/38976811/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com