peewee选择在使用模型实例而不是直接使用模型时不起作用的地方

时间:2018-06-26 18:16:23

标签: python peewee

我有一个Peewee模型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数据库的屏幕截图,如用于SQLite的DB Browswer所示: enter image description here

然后我创建表的一个实例:     scheme_table = ScenarioTable()

然后,在Python Shell中,导入实例:

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 :(得分:1)

我正在尝试重现您的问题,但不能。

首先,我创建数据库和表:

public class F1 {
public static void main(String args[])throws Exception{
    Scanner X =new Scanner(new File("C:\\data1.txt"));
    Scanner Y =new Scanner(new File("C:\\data2.txt"));
    double a=0.0,b=0.0,c,d=0.0,e=0.0,f,g,h;
    List<Double>list1=new ArrayList<>();
    List<Double>list4=new ArrayList<>();
    double arr[]=new double[10];
    double arr1[]=new double[5];
        while (X.hasNext()) {
            a = X.nextDouble();
            list1.add(a);
            b = X.nextDouble();
            c = X.nextDouble();

        }

        while(Y.hasNext()) {
            d = Y.nextDouble();
            list4.add(d);
            e = Y.nextDouble();

            f = Y.nextDouble();

            g = Y.nextDouble();


        }

    for(int i=0;i<list1.size();i++) {

        arr[i]=list1.get(i);//Store value into an array
        }
        for(int j=0;j<list4.size();j++){
            arr1[j]=list4.get(j);//Store value into an array
        }
        for(int k=0;k<arr.length;k++){
       // Appending condition
        }
}

然后我插入两行:

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()

因此它在这里有效-也许您在做其他错误,但您提供的代码正确