#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. У нас сжатые сроки, но я постараюсь сделать это для следующего проекта.