Peewee AttributeError - При выборе с более чем одним объединением
Мне нужна помощь, пожалуйста, я получаю следующую ошибку, когда я пытаюсь выбрать с объединением в существующей базе данных (это от клиента, и у меня есть только разрешение на чтение (выберите), я не могу изменить его в любом аспекте)
Может быть, ошибка в модельных классах, но я новичок в Peewee ORM и не знаю, как объявить эти отношения:::
(работа) C:\Users\eguzman\Documents\python-work\asterisk-insert-Remder>python script.py Traceback (последний вызов был последним): файл "script.py", строка 41, в row.ageagendas.CODIGO, row.ageagendas.PER_ID, row.stkpersonas.DOCUMENTO)) AttributeError: объект AgeCitas не имеет атрибута stkpersonas
Код: script.py
import peewee as pw
from classes.model import MySqlDbModel, AgeCitas, AgeAgendas, StkPersonas
class SelectCitasToRemind(MySqlDbModel):
@staticmethod
def selectCitasToRemind():
cit = AgeCitas.alias()
age = AgeAgendas.alias()
per = StkPersonas.alias()
query = (cit.select(
cit.CIT_ID, cit.AGE_ID, cit.FECHAHORA,
age.AGE_ID, age.CODIGO, age.CEN_ID, age.PER_ID,
per.PER_ID, per.DOCUMENTO, per.NOMBRE)
.join(age, pw.JOIN.LEFT_OUTER, on=(cit.AGE_ID == age.AGE_ID))
.join(per, pw.JOIN.LEFT_OUTER, on=(age.PER_ID == per.PER_ID))
.where((cit.CIT_ID.is_null(False))
& (cit.PAC_ID.is_null(False))
)
.limit(10)
)
return query
query = SelectCitasToRemind.selectCitasToRemind()
for row in query:
print("{} | {} | {} | {} | {} | {}".format(
row.CIT_ID, row.AGE_ID, row.FECHAHORA,
row.ageagendas.CODIGO, row.ageagendas.PER_ID, row.stkpersonas.DOCUMENTO))
Код: classes / model.py
import peewee as pw
# Conection to mydbname database
dbn = 'mydbname'
user = 'myusername'
pwd = '******'
host = 'localhost'
prt = 3306
db = pw.MySQLDatabase(dbn, user=user,
password=pwd, host=host, port=prt)
class MySqlDbModel(pw.Model):
class Meta:
database = db
class AgeCitas(MySqlDbModel):
CIT_ID = pw.BigIntegerField()
AGE_ID = pw.BigIntegerField()
FECHAHORA = pw.DateTimeField()
ACT_ID = pw.BigIntegerField()
PAC_ID = pw.BigIntegerField()
ASIGNADA = pw.CharField()
IND_ID = pw.BigIntegerField()
ACUDIO = pw.DoubleField()
ORDEN = pw.DoubleField()
class Meta:
table_name = 'AGE_CITAS'
class AgeAgendas(MySqlDbModel):
AGE_ID = pw.DecimalField()
CODIGO = pw.CharField()
CEN_ID = pw.DecimalField()
PER_ID = pw.DecimalField()
NPR_ID = pw.DecimalField()
DESCRIPCION = pw.CharField()
COLOR = pw.CharField()
class Meta:
table_name = 'AGE_AGENDAS'
class StkPersonas(MySqlDbModel):
PER_ID = pw.BigIntegerField()
DOCUMENTO = pw.CharField()
NOMBRE = pw.CharField()
APELLIDO1 = pw.CharField()
APELLIDO2 = pw.CharField()
FECHA_ALTA = pw.DateTimeField()
FECHA_BAJA = pw.DateTimeField()
EMAIL = pw.CharField()
TELEFONO1 = pw.CharField()
TELEFONO2 = pw.CharField()
TELEFONO3 = pw.CharField()
TELEFONO4 = pw.CharField()
SEXO = pw.CharField()
NACIMIENTO = pw.DateTimeField()
ES_PACIENTE = pw.CharField()
ES_PROFESIONAL = pw.CharField()
class Meta:
table_name = 'STK_PERSONAS'
2 ответа
Поскольку у вас, похоже, нет фактических внешних ключей, вам нужно рассказать peewee, как восстановить граф модели, предоставив псевдонимы в предикатах соединения:
.join(age, pw.JOIN.LEFT_OUTER, on=(cit.AGE_ID == age.AGE_ID).alias('agecitas'))
.join(per, pw.JOIN.LEFT_OUTER, on=(age.PER_ID == per.PER_ID).alias('sktpersona'))
Если удалить второе объединение, оно работает, но мне действительно нужна помощь, чтобы оно работало с обоими объединениями:
import peewee as pw
from classes.model import BaseModel, AgeCitas, AgeAgendas, StkPersonas
class SelectCitasToRemind(BaseModel):
@staticmethod
def selectCitasToRemind():
cit = AgeCitas.alias()
age = AgeAgendas.alias()
query = (cit.select(
cit.CIT_ID, cit.AGE_ID, cit.FECHAHORA,
age.AGE_ID, age.CODIGO, age.CEN_ID, age.PER_ID)
.join(age, pw.JOIN.LEFT_OUTER, on=(cit.AGE_ID == age.AGE_ID).alias('agecitas'))
.where((cit.CIT_ID.is_null(False))
& (cit.PAC_ID.is_null(False))
)
.limit(10)
)
return query
query = SelectCitasToRemind.selectCitasToRemind()
for row in query:
print("{} | {} | {} | {} | {}".format(
row.CIT_ID, row.AGE_ID, row.FECHAHORA,
row.agecitas.CODIGO, row.agecitas.PER_ID))
Результат: (работа) C:\Users\eguzman\Documents\python-work\asterisk-insert-Remder-temp>python script.py 744903633820 | 11540 | 2014-02-03 09:00:00 | ххххх | 10174325 744903633837 | 11540 | 2014-02-05 08:00:00 | ххххх | 10174325 744903634152 | 11540 | 2014-02-17 15:00:00 | ххххх | 10174325 744903634179 | 11540 | 2014-02-20 15:10:00 | ххххх | 10174325 744903634224 | 11540 | 2014-01-30 17:00:00 | ххххх | 10174325 744903634491 | 11560 | 2014-02-18 14:15:00 | ххххх | 10174353 744903634541 | 11540 | 2014-03-06 09:40:00 | ххххх | 10174325 744903634753 | 11620 | 2014-04-10 08:30:00 | ххххх | 11077145 744903634976 | 11640 | 2014-04-21 08:30:00 | ххххх | 11077165 744903634979 | 11640 | 2014-04-21 09:15:00 | ххххх | 11077165
Но мне действительно нужно второе соединение. Как я могу сделать так, чтобы оно работало с обоими объединениями???
.join(age, pw.JOIN.LEFT_OUTER, on=(cit.AGE_ID == age.AGE_ID).alias('agecitas'))
.join(per, pw.JOIN.LEFT_OUTER, on=(age.PER_ID == per.PER_ID).alias('sktpersona'))
И делать:
for row in query:
print("{} | {} | {} | {} | {} | {}".format(
row.CIT_ID, row.AGE_ID, row.FECHAHORA,
row.agecitas.CODIGO, row.agecitas.PER_ID, row.sktpersona.DOCUMENTO))
Спасибо