Chris Green wrote: > MRAB <pyt...@mrabarnett.plus.com> wrote: >> On 2017-03-12 22:44, Chris Green wrote: >> > This should be simple but I can't manage it at the moment! :-) >> > >> > I have opened a database connection and have set the row_factory to >> > sqlite3.Row. >> > >> > So how do I actually iterate through a row of data having used >> > fetchone to read a row. >> > >> > I.e. I have:- >> > >> > self.conn = sqlite3.connect(dbname) >> > self.conn.row_factory = sqlite3.Row >> > self.cursor = self.conn.cursor() >> > self.table = table >> > ... >> > ... >> > sql = "SELECT * FROM " + self.table + " WHERE >> > firstName||lastName = ?" self.cursor.execute(sql, (name,)) >> > row = self.cursor.fetchone() >> > >> > I want a for loop which gives me the column names and values. >> > >> The docs tell you that the sqlite3.Row instances are like tuples, but >> with additional features, such as a .keys() method that will tell you >> the column names. Try: >> >> print(row.keys()) >> >> With a little experimentation you'll find that can pass it to dict. Try: >> >> print(dict(row)) >> > so are you saying that I should be able to write:- > > rowAsDict = dict(row)
You can either forget about about the custom row_factory and use cursor.description >>> import sqlite3 >>> db = sqlite3.connect(":memory:") >>> cs = db.cursor() >>> cs.execute("select 1 foo, 2 bar") <sqlite3.Cursor object at 0x7f9a5b37f3b0> >>> names = [col[0] for col in cs.description] >>> names ['foo', 'bar'] >>> for row in cs: ... for name, value in zip(names, row): ... print(name, value, sep=": ") ... foo: 1 bar: 2 or use sqlite3.Row and its keys() method: >>> cs.row_factory = sqlite3.Row >>> for row in cs.execute("select 1 ham, 2 spam"): ... for name in row.keys(): ... print(name, row[name], sep=": ") ... ham: 1 spam: 2 -- https://mail.python.org/mailman/listinfo/python-list