Опрашивать таблицу SQL с помощью Python?

#python #sqlalchemy

#python #sqlalchemy

Вопрос:

Я хочу реализовать что-то похожее на это, где пользовательская функция classify_process() постоянно запрашивает базу данных Redis для новых записей.

Можно ли это сделать с помощью обычной таблицы SQL? db.pipeline() Похоже, что это зависит от Redis, поэтому я не уверен, как имитировать эту функциональность в базе данных SQL.

Моя цель — проверить одну таблицу на наличие новых строк, и если есть новая строка, выполнить прогноз с использованием модели ML.

ВОПРОС: Как я могу постоянно проверять, есть ли какие-либо новые записи в таблице MS SQL (в которой есть столбец interger ID, который автоматически увеличивается), а затем запускать функцию?

Моя идея о том, что должно произойти с использованием sqlalchemy :

 import time 
from sqlalchemy import create_engine

from sqlalchemy.orm import sessionmaker

DRIVER = 'driver'
SERVER = 'server'
DATABASE = 'database'


engine = create_engine(f'mssql pyodbc://{SERVER}/{DATABASE}?{DRIVER}')

SessionLocal = sessionmaker(bind=engine)

def some_process():
    while True:

        # look for new rows in table, then execute prediction on newest rows
        ...some code...?

        # Sleep for x seconds

        time.sleep(5)


if __name__ == "__main__":
    some_process()
 

Комментарии:

1. Является ли столбец ID автоматически увеличивающимся целочисленным значением?

2. Если вы используете PostgresDB, вы можете проверить этот пакет pypi.org/project/pgpubsub

3. @Take_Care_ — К сожалению, это не так. Я использую MS SQL.

Ответ №1:

С помощью первичного ключа с автоматическим увеличением integer ( IDENTITY(1,1) ) вы бы проверяли наличие новых строк, просматривая наибольшее значение PK …

 SELECT TOP 1 id FROM your_table ORDER BY id DESC
 

… и сравните его с предыдущим наибольшим значением, например

 max_id_query = session.query(Thing.id).order_by(Thing.id.desc()).limit(1)
last_max_id = max_id_query.scalar()
while True:
    max_id = max_id_query.scalar()
    if max_id > last_max_id:
        print(
            f"New row(s) found. "
            f"Processing ids {last_max_id   1} through {max_id}"
        )
        # … do stuff

        last_max_id = max_id
    time.sleep(5)