Reputation: 1
I needs help please, I'm getting the following error when I try a select with join in a existing database (it's from a client, and I have only permission for read (select) I can't modify it in any aspect)
May be the error is in the model classes, but I'm new in Peewee ORM and I don't know as well how to declarate these relationships:::
(work) C:\Users\eguzman\Documents\python-work\asterisk-insert-reminder>python script.py Traceback (most recent call last): File "script.py", line 41, in row.ageagendas.CODIGO, row.ageagendas.PER_ID, row.stkpersonas.DOCUMENTO)) AttributeError: 'AgeCitas' object has no attribute 'stkpersonas'
The code: 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))
The code: 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'
Upvotes: 0
Views: 1210
Reputation: 1
If remove the second join, it's work, but I really need help to make it's works with both joins, however::
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))
Result: (work) C:\Users\eguzman\Documents\python-work\asterisk-insert-reminder-temp>python script.py 744903633820 | 11540 | 2014-02-03 09:00:00 | xxxxx | 10174325 744903633837 | 11540 | 2014-02-05 08:00:00 | xxxxx | 10174325 744903634152 | 11540 | 2014-02-17 15:00:00 | xxxxx | 10174325 744903634179 | 11540 | 2014-02-20 15:10:00 | xxxxx | 10174325 744903634224 | 11540 | 2014-01-30 17:00:00 | xxxxx | 10174325 744903634491 | 11560 | 2014-02-18 14:15:00 | xxxxx | 10174353 744903634541 | 11540 | 2014-03-06 09:40:00 | xxxxx | 10174325 744903634753 | 11620 | 2014-04-10 08:30:00 | xxxxx | 11077145 744903634976 | 11640 | 2014-04-21 08:30:00 | xxxxx | 11077165 744903634979 | 11640 | 2014-04-21 09:15:00 | xxxxx | 11077165
But I really need de second join, How I can to make it works with both joins???
.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'))
And doing:
for row in query:
print("{} | {} | {} | {} | {} | {}".format(
row.CIT_ID, row.AGE_ID, row.FECHAHORA,
row.agecitas.CODIGO, row.agecitas.PER_ID, row.sktpersona.DOCUMENTO))
Thanks
Upvotes: 0
Reputation: 26235
Since you don't appear to have actual foreign-keys, you'll need to tell peewee how to reconstruct the model graph by providing aliases in your join predicates:
.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'))
Upvotes: 1