Простой вопрос sqlite

5

Когда я использую:

for i in Selection:
    Q = "SELECT columnA FROM DB WHERE wbcode='"+i+"' and commodity='1'"
    cursor.execute(Q)
    ydata[i] = cursor.fetchall()

Я получаю:

ydata = {'GBR': [(u'695022',), (u'774291',), (u'791499',)... ]}

Как я могу изменить свой код, чтобы получить:

ydata = {'GBR': [695022, 774291, 791499,...]}

Большое спасибо. obs: это просто упрощенный пример. попытайтесь воздержаться от рекомендаций по SQL-инъекции.

  • 4
    +1 за "попробуй воздержаться от рекомендаций по внедрению sql" :)
  • 0
    Он не только разрешает внедрение (если Selection происходит из пользовательского ввода), но также влияет на кэширование операторов. На самом деле, сделать это правильно не сложнее, поэтому нет никакого оправдания для ручного построения ваших операторов SQL.
Теги:

2 ответа

4
Лучший ответ
[int(x[0]) for x in cursor.fetchall()]
  • 0
    Спасибо, это сработало.
  • 0
    Иногда я получаю: ValueError: неверный литерал для int (): NULL; Вы хотели бы исправить это?
Показать ещё 1 комментарий
2

Исходя из этого и другого вашего вопроса, вам нужно понять близость SQLite и то, как вы заполняете базу данных. Другие базы данных требуют, чтобы значения, хранящиеся в столбце, были одного типа - например, всех строк или всех целых чисел. SQLite позволяет хранить что-либо, чтобы тип в каждой строке отличался.

В первом приближении, если вы введете строку для этой строки, вы получите строку, поместите целое число и вы получите целое число. В вашем случае вы получаете строки из-за того, что вместо строк вы помещаете строки.

Однако вы можете объявить аффинность столбца, и SQLite попытается преобразовать, когда вы вставляете данные. Например, если столбец имеет целочисленное сродство, то если то, что вы вставляете, можно безопасно/правильно преобразовать в целое число, тогда SQLite сделает это, поэтому строка "1" действительно будет сохранена как целое число 1, в то время как "1 1" будет сохранено как строка "1 1".

Прочитайте эту страницу, чтобы понять детали. Вы обнаружите, что намного проще получить данные, если вы положите их на использование правильных типов.

http://www.sqlite.org/datatype3.html

Если вы импортируете CSV-данные, запустите оболочку APSW и используйте ".help import", чтобы получить некоторые предложения о том, как с этим справиться.

  • 0
    Отлично. Большое спасибо.

Ещё вопросы

Сообщество Overcoder
Наверх
Меню