Как написать пошаговый запрос по шагам с sqlite и python? - PullRequest
0 голосов
/ 22 сентября 2019

Я новичок в программировании sqlite и python.Я хочу написать запрос на выборку для таблицы с шагом в 50 шагов (выбрать первые 50 записей, вторые 50 до последней записи в соответствии с предложением where).

для этой части я использовал ' предложение limit 'Я получил 50 записей.Но он просто получает первые 50 записей.

cur.execute(""" SELECT * FROM Log_Table WHERE name= 'x  limit 50 """)
print(cur.fetchall())

Я хочу выбрать записи в цикле for с шагом 50 записей.Я пробую это с помощью функции range , но это не сработало.

1 Ответ

1 голос
/ 22 сентября 2019

Как правило, вы хотите ..... LIMIT 50 OFFSET 0 для первого, затем LIMIT 50 OFFSET 50 для следующего до LIMIT 50 OFFSET a_number_as_big_or_bigger_than_the_number_of_rows, в этом случае будет возвращено 0 строк.

Возможно, рассмотрите следующее, когда вводится дополнительная контрольная таблица, котораяможет сделать вещь гибкой и довольно простой: -

/* Just in case the tables exist */
DROP TABLE IF EXISTS mainTable;
DROP TABLE IF EXISTS iterationControl;

/* The table that will be progressively interrogated */
CREATE TABLE IF NOT EXISTS mainTable(aColumn INTEGER PRIMARY KEY);

/* The control table, could perhaps be TEMP table*/
CREATE TABLE IF NOT EXISTS iterationControl (chunkSize INTEGER, chunkStart INTEGER); 
DELETE FROM iterationControl; /* Just in case, clear any rows */
INSERT INTO iterationControl VALUES(50,0,0); /* initialise the iteration table */

/* reset the chunk size for less out for this example only */
UPDATE iterationControl SET chunkSize = 5;
/* reset to the start (not needed here but as an example of how to)*/
UPDATE iterationControl SET chunkStart = 0;

/* Load some data purely included for testing purposes */
WITH RECURSIVE cte1(val) AS (SELECT 1 UNION ALL SELECT val+1 FROM cte1 LIMIT 10000)
INSERT INTO mainTable SELECT val FROM cte1;

/**START OF TESTING**/
/* First grab */
SELECT * FROM mainTable LIMIT (SELECT chunkSize FROM iterationControl) OFFSET (SELECT chunkStart FROM iterationControl);
/* Post run update*/
UPDATE iterationControl SET chunkStart = chunkStart + chunkSize;

/* 2nd grab */
SELECT * FROM mainTable LIMIT (SELECT chunkSize FROM iterationControl) OFFSET (SELECT chunkStart FROM iterationControl);
/* Post run update modified to skip till past the end ONLY FOR EASE OF DEMO */
UPDATE iterationControl SET chunkStart = chunkStart + chunkSize + 100000;

/* 3rd grab (mimic last) */
SELECT * FROM mainTable LIMIT (SELECT chunkSize FROM iterationControl) OFFSET (SELECT chunkStart FROM iterationControl);

/* Reset iteration Control to start from the begining*/
UPDATE iterationControl SET chunkStart = 0;
/* First of a new set of grabs */
SELECT * FROM mainTable LIMIT (SELECT chunkSize FROM iterationControl) OFFSET (SELECT chunkStart FROM iterationControl);
UPDATE iterationControl SET chunkStart = chunkStart + chunkSize;

/* change size of data part way through from 5 to 13 rows per grab */
UPDATE iterationControl SET chunkSize = 13;
/* 2nd grab now at 13 per grab */
SELECT * FROM mainTable LIMIT (SELECT chunkSize FROM iterationControl) OFFSET (SELECT chunkStart FROM iterationControl);
/* no change to post run even though different grab size */
UPDATE iterationControl SET chunkStart = chunkStart + chunkSize;

/* 3rd grab (just to show that post update worked correctly) */
SELECT * FROM mainTable LIMIT (SELECT chunkSize FROM iterationControl) OFFSET (SELECT chunkStart FROM iterationControl);
UPDATE iterationControl SET chunkStart = chunkStart + chunkSize;


/* clean up the database as I do not want these tables hanging around */
DROP TABLE IF EXISTS mainTable;
DROP TABLE IF EXISTS iterationControl;

Результаты

Результатами из вышеупомянутого являются

1.Самый первый захват (5 строк в соответствии с контролем)

enter image description here

2.2-й захват (следующие 5)

enter image description here

3.Последний захват (без строк после конца (в данном случае мимо))

enter image description here

4.После сброса для запуска (сначала захватите снова)

enter image description here

5.После «на лету» измените размер захвата / патрона (с 5 на 13)

enter image description here

6.Еще один пример из 13, просто для подтверждения того же поста, что обновление корректно работает

enter image description here

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