This issue tracker has been migrated to GitHub, and is currently read-only.
For more information, see the GitHub FAQs in the Python's Developer Guide.

classification
Title: sqlite3.Row class, handling duplicate column names resulting from a SQL join
Type: behavior Stage:
Components: Library (Lib) Versions: Python 2.6
process
Status: closed Resolution: works for me
Dependencies: Superseder:
Assigned To: Nosy List: ggenellina, sockonafish
Priority: normal Keywords:

Created on 2009-01-29 23:53 by sockonafish, last changed 2022-04-11 14:56 by admin. This issue is now closed.

Messages (4)
msg80798 - (view) Author: Brandon Adams (sockonafish) Date: 2009-01-29 23:53
When using sqlite3.Row as the row_factory for a sqlite3 connection and 
performing a SQL join that returns rows from two or more tables with 
identical column names, the returned sqlite3.Row object contains 
duplicate keys.  Subsequently, when trying to access values by key, only 
the value contained in the lowest numbered index matching the key is 
returned.  Additionally, attempting to use the keys returned to create a 
new table in the database fails due to a duplicate column name error.

A better behavior would be for the sqlite3.Row object's indices to be 
prefixed with table names for cases in which a query produces results 
from two or more tables.
msg80847 - (view) Author: Gabriel Genellina (ggenellina) Date: 2009-01-31 01:34
I think this is a sqlite issue, not a Python one.
cursor.description should return unique column names.
msg80849 - (view) Author: Gabriel Genellina (ggenellina) Date: 2009-01-31 02:22
See http://www.sqlite.org/cvstrac/tktview?tn=3221

Try upgrading to the latest sqlite release. Or set "pragma 
full_column_names=ON;"

import sqlite3
conn = sqlite3.connect(':memory:')
cursor = conn.cursor()
cursor.execute("create table T (a, b, c)")
cursor.execute("insert into T values (1, 2, 3)")
cursor.execute("insert into T values (2, 3, 4)")
conn.commit()
cursor.execute("pragma short_column_names=OFF;")
cursor.execute("pragma full_column_names=ON;")
cursor.execute("select * from T T1, T T2 where T1.a=T2.b")
print [d[0] for d in cursor.description]
# output: ['T1.a', 'T1.b', 'T1.c', 'T2.a', 'T2.b', 'T2.c']
msg80853 - (view) Author: Brandon Adams (sockonafish) Date: 2009-01-31 03:51
Ah, that's it.  Thanks for the tip, this issue can be closed now.
History
Date User Action Args
2022-04-11 14:56:45adminsetgithub: 49355
2009-02-05 14:16:46georg.brandlsetstatus: open -> closed
resolution: works for me
2009-01-31 03:51:02sockonafishsetmessages: + msg80853
2009-01-31 02:22:11ggenellinasetmessages: + msg80849
2009-01-31 01:34:51ggenellinasetnosy: + ggenellina
messages: + msg80847
2009-01-29 23:53:29sockonafishcreate