简体   繁体   English

Peewee AttributeError-当选择多个连接时

[英]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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM