[英]Peewee AttributeError - When select with more than one join
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 ::: 可能是模型类中的错误,但是我是Peewee ORM的新手,我也不知道如何声明这些关系 :::
(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' (工作)C:\\ Users \\ eguzman \\ Documents \\ python-work \\ asterisk-insert-reminder> python script.py回溯(最近一次调用为最后一次):在row.ageagendas.CODIGO的第41行,文件“ script.py” ,row.ageagendas.PER_ID,row.stkpersonas.DOCUMENTO))AttributeError:“ AgeCitas”对象没有属性“ stkpersonas”
The code: script.py 代码: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 代码: 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'
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: 由于您似乎没有实际的外键,因此需要通过在连接谓词中提供别名来告诉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'))
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 | 结果:(工作)C:\\ Users \\ eguzman \\ Documents \\ python-work \\ asterisk-insert-reminder-temp> python script.py 744903633820 | 11540 |
11540 | 2014-02-03 09:00:00 |
2014-02-03 09:00:00 | xxxxx |
xxxxx | 10174325 744903633837 |
10174325 744903633837 | 11540 |
11540 | 2014-02-05 08:00:00 |
2014-02-05 08:00:00 | xxxxx |
xxxxx | 10174325 744903634152 |
10174325 744903634152 | 11540 |
11540 | 2014-02-17 15:00:00 |
2014-02-17 15:00:00 | xxxxx |
xxxxx | 10174325 744903634179 |
10174325 744903634179 | 11540 |
11540 | 2014-02-20 15:10:00 |
2014-02-20 15:10:00 | xxxxx |
xxxxx | 10174325 744903634224 |
10174325 744903634224 | 11540 |
11540 | 2014-01-30 17:00:00 |
2014-01-30 17:00:00 | xxxxx |
xxxxx | 10174325 744903634491 |
10174325 744903634491 | 11560 |
11560 | 2014-02-18 14:15:00 |
2014-02-18 14:15:00 | xxxxx |
xxxxx | 10174353 744903634541 |
10174353 744903634541 | 11540 |
11540 | 2014-03-06 09:40:00 |
2014-03-06 09:40:00 | xxxxx |
xxxxx | 10174325 744903634753 |
10174325 744903634753 | 11620 |
11620 | 2014-04-10 08:30:00 |
2014-04-10 08:30:00 | xxxxx |
xxxxx | 11077145 744903634976 |
11077145 744903634976 | 11640 |
11640 | 2014-04-21 08:30:00 |
2014-04-21 08:30:00 | xxxxx |
xxxxx | 11077165 744903634979 |
11077165 744903634979 | 11640 |
11640 | 2014-04-21 09:15:00 |
2014-04-21 09:15:00 | xxxxx |
xxxxx | 11077165
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 谢谢
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.