Найти - Пользователи
Полная версия: [Решено] sqlite3.row con.row_factory почему arr=cursor.fetchall() возвращает список, а не sqlite3.row?
Начало » Базы данных » [Решено] sqlite3.row con.row_factory почему arr=cursor.fetchall() возвращает список, а не sqlite3.row?
1
Pluto
import sqlite3
def get_data_from_tables_sqlite3row(con, cur):
    con.row_factory = sqlite3.Row
    
    cur.execute("SELECT * FROM user")
    arr = cur.fetchall()
    print ("тип arr:", type(arr))
    print ("Кол-во полей с строке: ", len(arr))
    print ("Доступ по индексу:", arr[0][1])
    print ("Доступ по имени поля:", arr[0]["email"], arr[0]["EMAIL"])
    for elem in arr[0]:
        print (elem)
    print("Имена полей:", arr[0].keys())
con = sqlite3.connect("test.sqlite3")
cur = con.cursor()
get_data_from_tables_sqlite3row(con, cur)
получаю:
—–
Traceback (most recent call last):
File “F:\PythonProg\SQLITE_LESSONS\sqlite.py”, line 151, in <module>
get_data_from_tables_sqlite3row(con, cur)
File “F:\PythonProg\SQLITE_LESSONS\sqlite.py”, line 129, in get_data_from_tables_sqlite3row
print (“Доступ по имени поля:”, arr, arr)
TypeError: tuple indices must be integers, not str
—–
почему arr=cursor.fetchall() возвращает список, а не sqlite3.row?

Я писал этот код, основываясь на примере из книги. Только там нет вызова процедуры, как у меня. Там код из моей процедуры в основном коде программы-примера.
Pluto
Есть тут кто?
Piton23
нет, все вымерли :)
ну возвращает список, в чем вопрос то?
Pluto
Piton23
ну возвращает список, в чем вопрос то?
В том, что вместо доступа к полю по его имени - облом!
print ("Доступ по имени поля:", arr[0]["email"]])
Эта строка должна выдать мне email из одноимённого поля таблицы БД. Ну, а коли я получаю не словарь, а список, то - облом! А в книге написано, что я должен получить доступ по имени ключа словаря (поля таблицы БД).
for elem in arr[0]:
        print (elem)
    print("Имена полей:", arr[0].keys())
Тут, естественно, тоже облом. Нету никаких keys у списка или кортежа.
Piton23
В какой книге вас сказано не понятно, из документации следует что возвращает список

Cursor.fetchall()

Fetches all (remaining) rows of a query result, returning a list. Note that the cursor’s arraysize attribute can affect the performance of this operation. An empty list is returned when no rows are available.


если уж очень хочеться введите свой словарь (быдло способ)
fields = {'имя': 0, ‘email’: 1…}
print arr[fields]

либо лучше рассматривайте sqllite3, я с ней не работал мб кто другой подскажет более толковое
PooH
Устанавливайте row_factory до создания курсора:
import sqlite3
def get_data_from_tables_sqlite3row(con):
    con.row_factory = sqlite3.Row
    cur = con.cursor()
    cur.execute("SELECT * FROM user")
    arr = cur.fetchall()
    print ("тип arr:", type(arr))
    print ("Кол-во полей с строке: ", len(arr))
    print ("Доступ по индексу:", arr[0][1])
    print ("Доступ по имени поля:", arr[0]["email"], arr[0]["EMAIL"])
    for elem in arr[0]:
        print (elem)
    print("Имена полей:", arr[0].keys())
con = sqlite3.connect("test.sqlite3")
get_data_from_tables_sqlite3row(con)
Pluto
PooH
Премного благодарен!
This is a "lo-fi" version of our main content. To view the full version with more information, formatting and images, please click here.
Powered by DjangoBB