Принуждение python принимать изменения переменных из базы данных без перезапуска кода

#python #mysql #database #variables #properties

#python #mysql #База данных #переменные #свойства

Вопрос:

Я использую следующий код для извлечения переменных из базы данных, которую Python использует для запуска автоматизированной машины. Я устанавливаю переменные через веб-интерфейс, управляемый PHP. Python считывает переменные и действует в соответствии с инструкциями.

Однако во время калибровки компьютера мы вынуждены перезапустить python, чтобы принять любые изменения переменных. Python не является моим родным языком и не является родным языком моих коллег. Очевидно, что это сэкономило бы много времени, если бы нам не приходилось перезапускать python для принятия изменений переменных.

Наш класс variable list сконструирован следующим образом;

 class VariableList():
connectdb = DbConnector(host='localhost', user='a', password='b', database='c')
result = connectdb.selectDb('variablelist','varA,varB')
for row in result:
    # INPUTS
    varA = row[1]
    varB = row[2] 
  

Каков Pythonic способ обойти эту проблему? Получатели / установщики? @property? Был бы очень признателен за пример для подражания…

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

1. Python здесь не отличается от любого другого языка. Вы извлекаете данные из базы данных, и если база данных изменяется, вам нужно прочитать эти изменения снова. Вероятно, вы захотите написать обработчик сигналов, который заставляет Python повторно инициализировать переменные при получении, например, SIGUSR1 . Затем, когда вы меняете базу данных, отправьте этот сигнал вашему процессу Python, чтобы запустить повторную инициализацию.

Ответ №1:

простой. Реализация Python выглядит следующим образом:

 
class VariableList():

    def __init__(self):
        self.db_con = DbConnector(host='localhost', user='a', password='b', database='c')

    @property
    def varA(self):
        return self.db_con.selectDb('variablelist','varA')

    @property.setter
    def varA(self, value):
        self.db_con.updateDb('variablelist', value)

  

а также вы можете реорганизовать свою модель с помощью фреймворка SQLAlchemy.
например

 from sqlalchemy (
    create_engine,
    Column, 
    Integer, 
    String,
)
from sqlalchemy.ext.declarative import declarative_base
from sqlalchemy.orm import sessionmaker

Base = declarative_base()
engine = create_engine(DB_DNS, 
                       pool_size=DB_POOL_SIZE, 
                       max_overflow=DB_MAX_OVERFLOW,
                       pool_recycle=DB_POOL_RECYCLE,
                       isolation_level="READ UNCOMMITTED",  # attention, the last one is important!
         )
Session = sessionmaker(bind=engine,
                       autocommit=False,
                       expire_on_commit=False)

class MyTable(Base):

    __tablename__ = MY_TABLE_NAME

    id = Column(Integer, primary=True)
    name = Column(String(32), nullable=True, default='', doc='user_name')

# query something
result = Session().query(MyTable).filter(CONDITION).all()
  

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

1. Я попробую ваше предложение (64 vars для работы). В моем случае установщиком является PHP-скрипт.

2. Платформа SQLAlchemy гарантирует, что свойства объекта ORM согласуются с базой данных, как только будет установлен isolation_level с «READ UNCOMMITTED»

3. вы проводили рефакторинг с помощью SQLAlchemy?

4. У нас сжатые сроки, но я постараюсь сделать это для следующего проекта.