簡體   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