Уведомления

Группа в Telegram: @pythonsu

#1 Март 13, 2008 13:27:45

qman
От:
Зарегистрирован: 2007-07-02
Сообщения: 444
Репутация: +  0  -
Профиль   Отправить e-mail  

c=db.cursor() как определить кол-во записей?

есть код
c=db.cursor()
c.execute('use archive')
c.execute('Mail_Warning')
while (c.fetchone() <> ''):
t = c.fetchone()
print “%s %s %s %s %s %s\n”%(t,t, t, t, t, t)
db.close()

как красиво сделать перебор всех записей (record) в переменной c?
как узнать их кол-во?
БД MSSQL платформа WIN.



Офлайн

#2 Март 13, 2008 13:44:50

j2a
От:
Зарегистрирован: 2006-06-29
Сообщения: 869
Репутация: +  1  -
Профиль   Отправить e-mail  

c=db.cursor() как определить кол-во записей?


curs = conn.cursor()
curs.execute('SELECT foo, bar FROM baz')
print “We will fetch %d records” % curs.rowcount
for i, rec in enumerate(curs.fetchall()):
print “rec %d: %s” % (i+1, rec)



Отредактировано (Март 13, 2008 13:45:05)

Офлайн

#3 Март 13, 2008 14:16:34

slivlen
От:
Зарегистрирован: 2006-07-06
Сообщения: 764
Репутация: +  0  -
Профиль   Отправить e-mail  

c=db.cursor() как определить кол-во записей?

qman
while (c.fetchone() <> ''):
    t = c.fetchone()
    print "%s %s %s %s %s %s\n"%(t[0],t[1], t[2], t[3], t[4], t[5])
Этот код распечатает только половину строк из результата выборки, тк вызов fetchone каждый раз возвращает очередную строку из результирующего множества.

Пример j2a тоже не самый удачный. Во-первых, в случае если в выборке будет очень много записей, то полное их извлечение за раз может съесть достаточно много оперативки, а во-вторых если кол-во выбранных записей будет > чем значение arraysize курсора, то будет, соответственно, получено не все результирующее множество,

Я обычно пользуюсь такой конструкцией:
row = curs.fetchone()
while(row):
   ...
   row = curs.fetchone()

Или такой(когда не удобно обращаться к колонкам по номерам):
def fetchone_dict(c):
    res_dict = {}
    res_tuple = c.fetchone()
    if not res_tuple:
        return res_tuple
    for i, col_val in enumerate(res_tuple):
        res_dict[c.description[i][0]] = col_val
    return res_dict
...
row = fetchone_dict(curs)
while(row):
   print row['col1'], row['col2']
   ...
   row = fetchone_dict(curs)



Офлайн

#4 Март 13, 2008 15:48:06

balu
От:
Зарегистрирован: 2006-05-24
Сообщения: 521
Репутация: +  0  -
Профиль   Отправить e-mail  

c=db.cursor() как определить кол-во записей?

qman
как узнать их кол-во?
На всякий случай универсальный способ
select count(*) from TABLE



Офлайн

#5 Март 13, 2008 16:09:37

slivlen
От:
Зарегистрирован: 2006-07-06
Сообщения: 764
Репутация: +  0  -
Профиль   Отправить e-mail  

c=db.cursor() как определить кол-во записей?

balu, это вернет кол-во записей в таблице, а не в выборке.



Офлайн

#6 Март 13, 2008 17:07:14

slav0nic
Команда
От: dp.ua
Зарегистрирован: 2006-05-07
Сообщения: 2260
Репутация: +  41  -
Профиль   Отправить e-mail  

c=db.cursor() как определить кол-во записей?

всем 2 =) или я не понял вопроса



print cursor.rowcount



пардон, у j2a таки было в коде) не заметил

Отредактировано (Март 13, 2008 18:07:49)

Офлайн

#7 Март 13, 2008 17:29:39

balu
От:
Зарегистрирован: 2006-05-24
Сообщения: 521
Репутация: +  0  -
Профиль   Отправить e-mail  

c=db.cursor() как определить кол-во записей?

slivlen
balu, это вернет кол-во записей в таблице, а не в выборке.
select count(*) from TABLE where mainkey > 1
slav0nic
всем 2 ;) или я не понял вопроса
Твой вариант только для Python-DBAPI. Мой для SQL-92 ;)



Отредактировано (Март 13, 2008 17:31:07)

Офлайн

#8 Март 13, 2008 20:08:44

slivlen
От:
Зарегистрирован: 2006-07-06
Сообщения: 764
Репутация: +  0  -
Профиль   Отправить e-mail  

c=db.cursor() как определить кол-во записей?

slav0nic
всем 2 smile или я не понял вопроса
Правильно понял, но их там 2 :)



Офлайн

#9 Март 13, 2008 20:19:06

slivlen
От:
Зарегистрирован: 2006-07-06
Сообщения: 764
Репутация: +  0  -
Профиль   Отправить e-mail  

c=db.cursor() как определить кол-во записей?

balu
Твой вариант только для Python-DBAPI. Мой для SQL-92 wink
А если в запросе будет GROUP BY или выборка будет из 10 таблиц? :)



Офлайн

#10 Март 14, 2008 10:43:23

balu
От:
Зарегистрирован: 2006-05-24
Сообщения: 521
Репутация: +  0  -
Профиль   Отправить e-mail  

c=db.cursor() как определить кол-во записей?

slivlen
А если в запросе будет GROUP BY или выборка будет из 10 таблиц?
SELECT count (*) FROM (SELECT * FROM TABLE…)

Явный минус тогда - запрос придется делать дважды. Тогда для python лучшее решение - cursor.rowcount(). Можно также поиграться с курсорами на уровне СУБД, но это не все СУБД умеют.



Офлайн

Board footer

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

Powered by DjangoBB

Lo-Fi Version