![](/img/trans.png)
[英]Inconsistent behaviour using sqlite3.Row to index into results by name
[英]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.