Есть программа на питоне, она подключается к базе данных (sql server 2016). Программа должна по очереди вытаскивать значения из таблиц. В таблице есть 2 колонки. В первый раз мне необходимо вытащить значение 1 колонки 1 строки, затем 1 колонки 2 строки и так далее. То есть нужен цикл. Как грамотно это дело оформить. Заранее спасибо
Если "в следующий раз" - это например завтра, то видимо где-то надо хранить последнюю считанную позицию и уже исходя из ее значения - запрашивать. Если же это "подряд" - то лучше считать все (если это конечно не миллионы строк) и уже потом крутится например в цикле.
Происходит порядок запросов
Для наглядности обрусую таблицу
Первый столбик :логины
Второй : пароли
Программа делает запросы в бд и посередине вставляет возвращаемое значения
Проблема в том, что мне нужно вначале получить логины, который хранится в 1 столбике 1 строки, затем логины из 1 столбика 2 строки и так далее до условного значения. Я не пойму как достать эти логины
d-stream: программа которая будет осуществлять вход в веб сервис по очереди из большого количества аккаунтов. Данные аккаунтов хранятся в бд. Вопрос как грамотно их перебрать?
GromWolf: такого типа программа, подразумевая что она может прекратить свою работу и начать потом снова в любой момент как минимум должна уметь "помнить" на чем она остановилась.
Вполне разумным будет хранить такую информацию в БД рядом с логинами-паролями. Например в виде даты-времени последнего обращения. То есть структура будет состоять как минимум из трех столбцов (логин, пароль, отметка времени). Вполне очевидно что последняя колонка должна быть nullable - когда "еще не использовали пару"
Соответственно логика будет выглядеть так:
получить
одну строку
логин-пароль-[дата-время]
из таблицы
отсортированной по дате-времени
на sql это будет ровно так же как же как и словами:
select
top 1
[логин], [пароль], [дата-время]
from [имя таблицы]
order by [дата-время] asc
с полученной парой логина-пароля делаем нечто
и при нужном результате пишем в базу текущую отметку времени
update [имя таблицы]
set [дата-время] = getdate()
where [логин]= логину AND [пароль]=паролю
далее возвращаемся на исходную и получаем следующую одну строчку
p/s/ естественно логин и пароль - не лучший уникальный ключ для выбора - так что потребуется некий "уникализатор", дальше захочется сохранять результат прошлого обращения и в зависимости от результата возможно больше записи не выбирать, далее захочется делать это в несколько потоков...
d-stream: я практически это и реализовал, но вопрос в том :
у меня есть ( например) два главных столбика - первый это логины, а второй это пароли. Для входа в аккаунт нужно передать две перменные, одной мы будем присваивать логин другой соответсвенно пароль. процесс такой: берем логин первого присваиваем переменно А. берем пароль и тоже самое к Б.
используем эти переменные. затем по циклу идем и тоже самое делаем с вторым аком. Как это цикл сделать. У меня не выходит...
GromWolf: не надо этот цикл делать. точнее делать пока sql что-то отдает.
А вот у sql просить "дай мне ОДНУ строчку по условиям..." - в общем то, что я и расписал выше.
по результатам дальнейшего шаманства с логином-паролем - писать в базу результат
в конечном итоге запрос перестанет возвращать результат (если в условии where будет только неокученные) - это и будет критерием окончания цикла.
Притом такая программа может быть прекращена в любой момент, а при повторном запуске продолжит перебирать только не окученных.
Доброго. Вот пара логин-пароль выбрана. superuser/Zj78!#G648 Вход типа осуществлен. Поставили пометку 02-07-2017 8-46.
Чудно. Ищем следующего... И тут происходит разрыв связи у superuser. А метка, что он в базе, стоит...
Что делать?
Теперь цикл. Как правильно сказали, цикл делать не надо. Структура должна быть типа такого
Id login_name pass_word login_date_time
1 superuser Zj78!#G648 NULL
Пароль причем шифруем.
Далее делаем процедуру. Диалект sql - t-sql. Для mysql использовать limit
select top 1 login_name, pass_word from tbl_cool_table where login_date_time is null
Вот такой запрос вернет вам ровно одну строку с человеком, который еще не в базе
При втором запуске - еще одну строку с человеком, который еще не в базе. И так до тех пор, пока есть хоть кто-то, у кого login_date_time пустой.
Читаем внимательнее -)
1. получаем ОДНУ запись для шаманства
2. шаманим
3. по результатам шаманства - пишем результат шаманства
Естественно в больших конструкциях зачастую в п.3 может быть и отметка времени и стэйт, а в п.3 отбор не только не окученных, но и для повторных попыток позиции со стэйтами подразумевающими повтор (сервис занят, таймаут) и счетчики попыток