2015-09-25 5 views
2

У меня есть запрос внутри скрипта python, который подключается к базе данных sql и извлекает пару (datetime, Id) для соответствующей строки. Мне нужно повторить набор результатов и отфильтровать часть «datetime» и «Id» отдельно. Мое намерение состоит в том, чтобы получить «ИД» для каждой строки. Таким образом, в следующем запросе мне нужно отфильтровать «275» (смотри ниже)Python TypeError: объект 'datetime.datetime' не подпишивается

На написание этого сценария:

cursor2.execute(query2, [item[0]]) 
values = cursor2.fetchone() 
#values now equals = (datetime.datetime(2015, 7, 22, 17, 17, 36), 275) 
print(values[0][1]) 

я получаю эту ошибку:

TypeError: 'datetime.datetime' object is not subscriptable

Я попытался преобразования значений к объектам list/string, но пока ничего не работает. Есть идеи?

+0

Что вы пытаетесь получить с помощью 'значений [0] [0]'? –

+0

Привет, просто обновил вопрос. Поэтому мне нужна часть «Id» для каждой строки, которую я получаю в наборе результатов. – 90abyss

ответ

2

Если вы просто пытаетесь получить полный объект datetime, просто используйте values[0] вместо values[0][0]. И для Id используйте values[1]. Пример -

>>> values = (datetime.datetime(2015, 7, 22, 17, 17, 36), 275) 
>>> print(values[1]) 
275 

values[0] относится к datetime объекта, поэтому, когда вы делаете values[0][1], вы пытаетесь использовать подстрочный на объект даты и времени, что невозможно, и, следовательно, ошибка.

Это потому, что вы используете cursor.fetchone(), который возвращает только одну строку в качестве кортежа. Если бы вы использовали или .fetchmany(), то то, что вы получили, было бы списком кортежей, и в этом случае вы также можете перебирать список, беря по одному кортежу за раз, и получать элемент по индексу 1. Пример -

for dateobj, id in cursor.fetchall(): 
    #Do your logic with `id`. 
1

когда вы звоните .fetchone() вы получите обратно кортеж (одна запись):

mydate, myid = cursor.fetchone() 

если вы просто хотите, чтобы получить id для каждой строки вы можете сделать:

ids = [record[1] for record in cursor.fetchall()] 

в целом, лучше всего выбрать нужные данные, возможно:

cursor.execute("select id from ({subquery}) t".format(subquery=query2), [item[0]]) # assuming the id column is named id 
ids = [record[0] for record in cursor.fetchall()] # now we're only retrieving one column (index zero) 
1

Чтобы получить 275, вам просто нужно

print(values[1]) 

предполагая

values == (datetime.datetime(2015, 7, 22, 17, 17, 36), 275) 
Смежные вопросы