问题
I have an instance of a peewee Model my_table = MyTable()
from which I want to select some model instances.
I don't understand why this works:
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']
but this doesn't:
In [1] selections = my_table.select().where(my_table.p_type=="Solar")
In [2] [t.p_name for t in selections]
Out [2]
Nothing is output. In fact, len(selections)=0
Am I doing something wrong?
My model definition is in one file and is as follows:
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])
I then populate the tables. Here is a screen capture of the SQLite database as seen DB Browswer for SQLite:
I then create an instance of the table: scenario_table = ScenarioTable()
Then, in a Python shell, I import the instance:
from x.y import scenario_table
I know it has all the model instances I expect (112):
>>> len(scenario_table.select())
112
And this works:
>>> [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']
But this doesn't:
>>> [t.pathway_name for t in scenario_table.select().where(scenario_table.pathway_type == 'Coal')]
[]
After trial and error, I was able to make things work by importing the model directly rather than an instance of the model. So, rather than:
from x.y import scenario_table
I now have:
from x.y import ScenarioTable
and now:
selections = ScenarioTable.select().where(ScenarioTable.pathway_type=='Coal')
[t.pathway_name for t in selections]
Does return the expected list of model instance names.
So my question is now: why does the model instance select
work, but not the model instance where
?
回答1:
I'm trying to reproduce your problem, but I can't.
First I create the database and the table:
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])
Then I insert two rows:
d1 = my_table(p_name="Solar, photovoltaic", p_type="Solar")
d1.save()
d2 = my_table(p_name="Windmill", p_type="Wind")
d2.save()
After that I try your command:
>>> [t.p_name for t in my_table.select().where(my_table.p_type=="Solar")]
['Solar, photovoltaic']
So it works here - maybe you're doing something else wrong, but the code you provided is correct
来源:https://stackoverflow.com/questions/51049195/peewee-select-where-not-working-when-using-a-model-instance-rather-than-a-model