Уведомления

Группа в Telegram: @pythonsu
  • Начало
  • » Базы данных
  • » [Решено] sqlite3.row con.row_factory почему arr=cursor.fetchall() возвращает список, а не sqlite3.row? [RSS Feed]

#1 Май 29, 2012 08:36:21

Pluto
Зарегистрирован: 2012-05-29
Сообщения: 177
Репутация: +  2  -
Профиль   Отправить e-mail  

[Решено] sqlite3.row con.row_factory почему arr=cursor.fetchall() возвращает список, а не sqlite3.row?

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 (Июнь 25, 2012 08:27:29)

Офлайн

#2 Май 29, 2012 11:01:08

Pluto
Зарегистрирован: 2012-05-29
Сообщения: 177
Репутация: +  2  -
Профиль   Отправить e-mail  

[Решено] sqlite3.row con.row_factory почему arr=cursor.fetchall() возвращает список, а не sqlite3.row?

Есть тут кто?

Офлайн

#3 Май 29, 2012 11:34:53

Piton23
От:
Зарегистрирован: 2011-10-17
Сообщения: 139
Репутация: +  5  -
Профиль   Отправить e-mail  

[Решено] sqlite3.row con.row_factory почему arr=cursor.fetchall() возвращает список, а не sqlite3.row?

нет, все вымерли :)
ну возвращает список, в чем вопрос то?

Офлайн

#4 Май 29, 2012 11:46:25

Pluto
Зарегистрирован: 2012-05-29
Сообщения: 177
Репутация: +  2  -
Профиль   Отправить e-mail  

[Решено] sqlite3.row con.row_factory почему arr=cursor.fetchall() возвращает список, а не sqlite3.row?

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

Отредактировано Pluto (Май 29, 2012 11:48:58)

Офлайн

#5 Май 29, 2012 15:30:25

Piton23
От:
Зарегистрирован: 2011-10-17
Сообщения: 139
Репутация: +  5  -
Профиль   Отправить e-mail  

[Решено] sqlite3.row con.row_factory почему arr=cursor.fetchall() возвращает список, а не sqlite3.row?

В какой книге вас сказано не понятно, из документации следует что возвращает список

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, я с ней не работал мб кто другой подскажет более толковое

Офлайн

#6 Май 29, 2012 16:25:52

PooH
От:
Зарегистрирован: 2006-12-05
Сообщения: 1948
Репутация: +  72  -
Профиль   Отправить e-mail  

[Решено] sqlite3.row con.row_factory почему arr=cursor.fetchall() возвращает список, а не sqlite3.row?

Устанавливайте 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)



Вот здесь один из первых отарков съел лаборанта. Это был такой умный отарк, что понимал даже теорию относительности. Он разговаривал с лаборантом, а потом бросился на него и загрыз…

Офлайн

#7 Май 30, 2012 05:30:50

Pluto
Зарегистрирован: 2012-05-29
Сообщения: 177
Репутация: +  2  -
Профиль   Отправить e-mail  

[Решено] sqlite3.row con.row_factory почему arr=cursor.fetchall() возвращает список, а не sqlite3.row?

PooH
Премного благодарен!

Офлайн

  • Начало
  • » Базы данных
  • » [Решено] sqlite3.row con.row_factory почему arr=cursor.fetchall() возвращает список, а не sqlite3.row?[RSS Feed]

Board footer

Модераторировать

Powered by DjangoBB

Lo-Fi Version