peewee выбирает, где не работает при использовании экземпляра модели, а не модели напрямую - PullRequest
0 голосов
/ 26 июня 2018

У меня есть экземпляр peewee Model my_table = MyTable(), из которого я хочу выбрать несколько экземпляров модели.

Я не понимаю, почему это работает:

In  [0] [selection.p_name for selection in my_table.select() if selection.p_type == "Solar"] 
Out [0] ['Solar, photovoltaic',
         'Solar, photovoltaic',
         'Solar, photovoltaic',
         'Solar, photovoltaic',
         'Solar, concentrated solar power',
         'Solar, concentrated solar power']

но это не так:

In  [1] selections = my_table.select().where(my_table.p_type=="Solar")
In  [2] [t.p_name for t in selections]
Out [2] 

Ничего не выводится. На самом деле len(selections)=0

Я что-то не так делаю?

Мое определение модели находится в одном файле и выглядит следующим образом:

cafe3db = SqliteDatabase(db_fp)

class Cafe3BaseModel(Model):
    class Meta:
        database = cafe3db
class ScenarioTable(Cafe3BaseModel):
    pathway_scenario_key = CharField(primary_key=True)
    pathway_type = CharField()
    pathway_name = CharField()

cafe3db.create_tables([ScenarioTable])

Затем я заполняю таблицы. Вот снимок экрана базы данных SQLite, как видно из БД Browswer для SQLite: enter image description here

Затем я создаю экземпляр таблицы: scene_table = ScenarioTable ()

Затем в оболочке Python я импортирую экземпляр:

from x.y import scenario_table

Я знаю, что у меня есть все ожидаемые экземпляры модели (112):

>>> len(scenario_table.select())
112

И это работает:

>>> [t.pathway_name for t in scenario_table.select() if t.pathway_type == 'Coal']
['Coal, sub-bituminous', 'Coal, bituminous', 'Coal, lignite', 'Coal, sub-bituminous', 'Coal, lignite', 'Coal, bituminous', 'Coal, bituminous', 'Coal, lignite']

Но это не так:

>>> [t.pathway_name for t in scenario_table.select().where(scenario_table.pathway_type == 'Coal')]
[]

После проб и ошибок я смог заставить работать вещи, импортировав модель напрямую, а не экземпляр модели. Итак, а не:

    from x.y import scenario_table

Теперь у меня есть:

    from x.y import ScenarioTable  

и сейчас:

selections = ScenarioTable.select().where(ScenarioTable.pathway_type=='Coal')
[t.pathway_name for t in selections]    

Возвращает ожидаемый список имен экземпляров модели.

Итак, мой вопрос сейчас: почему работает экземпляр модели select, а не экземпляр модели where?

1 Ответ

0 голосов
/ 26 июня 2018

Я пытаюсь воспроизвести вашу проблему, но не могу.

Сначала я создаю базу данных и таблицу:

import peewee
db = peewee.SqliteDatabase('test.db')
db.connect()

class my_table(peewee.Model):
    p_name = peewee.CharField()
    p_type = peewee.CharField()

    class Meta:
        database = db
db.create_tables([my_table])

Затем я вставляю две строки:

d1 = my_table(p_name="Solar, photovoltaic", p_type="Solar")
d1.save()
d2 = my_table(p_name="Windmill", p_type="Wind")
d2.save()

После этого я пробую вашу команду:

>>> [t.p_name for t in my_table.select().where(my_table.p_type=="Solar")]
['Solar, photovoltaic']

Так что это работает здесь - может быть, вы делаете что-то еще неправильно, но код, который вы предоставили, является правильным

...