在python中,如何从不同服务器的数据库中正确获取对象?
我正在尝试使用django使用机器学习和web服务器,我的web和机器学习服务器都使用相同的Docked postgres数据库。机器学习服务器创建机器学习模型,并使用pickle将其写入数据库。我在机器学习服务器上有一个回归器类,如下所示:在python中,如何从不同服务器的数据库中正确获取对象?,python,django,database,Python,Django,Database,我正在尝试使用django使用机器学习和web服务器,我的web和机器学习服务器都使用相同的Docked postgres数据库。机器学习服务器创建机器学习模型,并使用pickle将其写入数据库。我在机器学习服务器上有一个回归器类,如下所示: class Regressor: def __init__(self): self.predictions = [] self.yTrue = [] self.predDiffs = []
class Regressor:
def __init__(self):
self.predictions = []
self.yTrue = []
self.predDiffs = []
self.model = object
self.name = ""
#some methods below
def getPredictions(request):
predictorArray = RegressorTable.objects.filter()
finalPrediction = finalDecision(predictorArray, np.array([20]).reshape(-1, 1))
context = {"prediction": finalPrediction}
return render(request, "get_predictions.html", context=context)
我有一个类,它为orm技术创建了一个合适的数据库表
class RegressorTable(DeclarativeBase):
__tablename__ = "ml_models"
id = Column(Integer, primary_key=True)
regressorName = Column(String)
regressorModel = Column(LargeBinary)
在机器学习和django web服务器中,我有两个函数,用于将模型转换为二进制,将二进制转换为模型
def modelToBinary(model):
return pickle.dumps(model)
def binaryToModel(data):
return pickle.loads(data)
以下是我在机器学习服务器中为数据库保存回归模型的方法:
def saveModelsToDb(predictorArray):
for predictor in predictorArray:
predictorForTable = RegressorTable()
predictorForTable.regressorName = predictor.name
predictorForTable.regressorModel = modelToBinary(predictor)
DBSession.add(predictorForTable)
DBSession.commit()
上述代码中的Predictor数组包含回归器对象。
当我尝试在机器学习服务器中保存和加载模型时,我可以成功地保存、加载和使用我的回归器对象。
我有一个web服务器,下面是我的模型:
class RegressorTable(models.Model):
regressorName = models.CharField(max_length=50)
regressorModel = models.BinaryField()
class Meta:
db_table = "ml_models"
在views.py中,我有上面提到的modelToBinary和binaryToModel方法。
我有这样一个代码:
class Regressor:
def __init__(self):
self.predictions = []
self.yTrue = []
self.predDiffs = []
self.model = object
self.name = ""
#some methods below
def getPredictions(request):
predictorArray = RegressorTable.objects.filter()
finalPrediction = finalDecision(predictorArray, np.array([20]).reshape(-1, 1))
context = {"prediction": finalPrediction}
return render(request, "get_predictions.html", context=context)
我可以在机器学习服务器中成功地保存、加载和使用Regressionor对象。在机器学习服务器中,我保存了回归器对象,并希望在django web服务器中使用它们。当我试图用上面的代码获取它们时,它会抛出一个异常
无法在上获取属性“回归器”
如何从django web服务器的数据库中正确加载机器学习服务器已保存到数据库中的Regressionor对象?两个应用程序中的模块名和类名必须相同,因为
pickle
使用这些名称来确定如何恢复类实例
基于上的,您的回归器类是在执行的主模块中定义的,这在Django中永远不会发生
在例如regressor.py
中定义类(或者更好的是,类似my\u ml\u library/regressor.py
的东西,其中my\u ml\u library
在两个应用程序中是同一个包)–还请记住pickle
不会保存函数定义,因此如果您进行的代码更改可能与旧数据不兼容,您需要重新培训您的模型。谢谢您的回答,我尝试了您的建议,但不幸的是,它对我不起作用。您知道有没有其他方法可以不使用pickle而将对象保存到数据库中?如果它对您不起作用,恐怕您没有正确地实现它。根据数据的不同,还有其他的方法,但没有一种会那么方便。对不起,我误解了你的建议。你能告诉我在django项目中我应该在哪里添加my_ml_库包吗?它有这样的软件包:SalesPredictionWeb>sales\u prediction,SalesPredictionWeb,static,templates,venv,manage.py只要两个应用程序都可以将其作为my\u ml\u库导入即可。谢谢,它对我来说很好用。