#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)