SQLAlchemy届会议管理在长期运行的过程
-
07-07-2019 - |
题
方案:
- A.网基应用程序服务器(Wonderware《国际会计准则》/系统平台)主持的自动化的对象,与各种设备对工厂车间。
- CPython托管内部这个应用程序服务器(用 蟒蛇。净).
- 自动化的对象有脚本功能中(使用一个自定义.净基于语言)。这些脚本呼叫蟒蛇的功能。
蟒蛇职能的一部分的系统来跟踪进行中的工作在该工厂的地板上。该系统的目的是跟踪所生产的部件,沿过程中,确保部件经过该进程在正确的顺序,检查某些条件得到满足沿着该进程。部件的生产历史和部件的状态存储在一个关系数据库,这是SQLAlchemy发挥其作用。
例如,当一个小部件通过扫描器,自动化软件的触发下面脚本(编写的应用程序服务器的定义脚本语言):
' wiget_id and scanner_id provided by automation object
' ExecFunction() takes care of calling a CPython function
retval = ExecFunction("WidgetScanned", widget_id, scanner_id);
' if the python function raises an Exception, ErrorOccured will be true
' in this case, any errors should cause the production line to stop.
if (retval.ErrorOccured) then
ProductionLine.Running = False;
InformationBoard.DisplayText = "ERROR: " + retval.Exception.Message;
InformationBoard.SoundAlarm = True
end if;
脚本话的 WidgetScanned
蟒蛇功能:
# pywip/functions.py
from pywip.database import session
from pywip.model import Widget, WidgetHistoryItem
from pywip import validation, StatusMessage
from datetime import datetime
def WidgetScanned(widget_id, scanner_id):
widget = session.query(Widget).get(widget_id)
validation.validate_widget_passed_scanner(widget, scanner) # raises exception on error
widget.history.append(WidgetHistoryItem(timestamp=datetime.now(), action=u"SCANNED", scanner_id=scanner_id))
widget.last_scanner = scanner_id
widget.last_update = datetime.now()
return StatusMessage("OK")
# ... there are a dozen similar functions
我的问题是: 我如何最佳管理SQLAlchemy会议,在这种情况? 该应用程序服务器是一个长期运行的过程中,通常运行几个月之间重新启动。该应用程序服务器的单的螺纹。
目前,我这样做以下方式:
我应用装饰的职能,我可以做到应用服务器:
# pywip/iasfunctions.py
from pywip import functions
def ias_session_handling(func):
def _ias_session_handling(*args, **kwargs):
try:
retval = func(*args, **kwargs)
session.commit()
return retval
except:
session.rollback()
raise
return _ias_session_handling
# ... actually I populate this module with decorated versions of all the functions in pywip.functions dynamically
WidgetScanned = ias_session_handling(functions.WidgetScanned)
问题: 是的装饰上适用于处理会议的一个长期运行的过程? 我应该叫 session.remove()
?
该SQLAlchemy届会议的对象是一个范围的会议:
# pywip/database.py
from sqlalchemy.orm import scoped_session, sessionmaker
session = scoped_session(sessionmaker())
我想让本届会议管理的基本功能。原因有两个:
- 还有另外一个家庭的功能,列功能。的序列功能的电话的几个基本功能。一个序列函数应该相等的一个数据库交易。
- 我需要能够使用的图书馆从其他环境。a)从一个TurboGears网应用程序。在这种情况下,会议管理是通过TurboGears.b)从IPython壳。在这种情况下,提交/rollback将是明确的。
(我真的很抱歉对于所长的问题。但我觉得我需要解释的情况。也许没有必要的?)
解决方案
所描述的装饰适用于长期运行的应用,但是可能会遇到麻烦,如果你不小心分享的对象之间的请求。使错误中较早出现的和不腐败的任何最好是放弃本届会议与会议。删除().
try:
try:
retval = func(*args, **kwargs)
session.commit()
return retval
except:
session.rollback()
raise
finally:
session.remove()
或者您可以使用 with
文经理:
try:
with session.registry().transaction:
return func(*args, **kwargs)
finally:
session.remove()
顺便说一句,你可能想要使用 .with_lockmode('update')
上查询所以你的验证不运行上的陈旧的数据。
其他提示
问问你的WonderWare管理员给你的访问Wonderware历史学家,你可以追踪的价值观的标签很容易地通过MSSQL通过sqlalchemy,你可以调查每隔一段时间。
另一个选择是使用archestra工具包,以听取的内部标记更新,并有一个服务器的部署作为一个平台,在银河系,你可以听从。