Python SQLite3 / Выбор строк из таблицы - PullRequest
0 голосов
/ 28 апреля 2018
board  balls  win1   win2   result
-----  -----  ----   ----   ------
    1      1     0      0        1
    4      1     0      0        1
 1024      1     0      0        1

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

connection = sqlite3.connect("spline.db")
crsr = connection.cursor()
crsr.execute("SELECT board FROM positions WHERE balls = 1")
result = crsr.fetchall()
print result
connection.close()

Результатом является список кортежей:

[(1,), (4,), (1024,)]

Есть ли способ получить список целых чисел напрямую? Один из способов сделать это с помощью:

print [result[i][0] for i in range(len(result))]

вместо:

print result

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

Ответы [ 3 ]

0 голосов
/ 28 апреля 2018

Почти никогда нет веских причин перебирать range(len(something)). Всегда перебирайте саму вещь.

[row[0] for row in result]
0 голосов
/ 28 апреля 2018

Вам не нужно звонить fetchall(); Вы можете выполнять итерацию непосредственно над курсором:

crsr.execute("SELECT ...")
for row in crsr:
    print row[0]

Это вычислит результирующие строки по требованию, поэтому весь список не нужно хранить в памяти.

И вы можете упростить это далее: execute() возвращает сам объект курсора, и вы можете использовать присваивание кортежей для извлечения значений из строки:

for (board,) in crsr.execute("SELECT board FROM ..."):
    print board
0 голосов
/ 28 апреля 2018

Вы можете использовать атрибут row_factory следующим образом:

connection = sqlite3.connect("spline.db")
conn.row_factory = lambda cursor, row: row[0]
crsr = connection.cursor()
crsr.execute("SELECT board FROM positions WHERE balls = 1")
result = crsr.fetchall()
print result
connection.close()

Это должно дать вам список, а не кортежи.

Подробнее о row_factory можно прочитать здесь .

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...