【问题标题】:Selecting column by string in Google App Engine NDB在 Google App Engine NDB 中按字符串选择列
【发布时间】:2017-08-02 11:20:41
【问题描述】:

我在 Google App Engine 中有一个实体,如下所示:

class HesapKalemi(ndb.Model):
hk=ndb.IntegerProperty(indexed=True)
ha=ndb.StringProperty(indexed=True)
A=ndb.FloatProperty(default=0.00)
B=ndb.FloatProperty(default=0.00)
C=ndb.FloatProperty(default=0.00)
F=ndb.FloatProperty(default=0.00)
G=ndb.FloatProperty(default=0.00)
H=ndb.FloatProperty(default=0.00)
I=ndb.FloatProperty(default=0.00)
J=ndb.FloatProperty(default=0.00)
DG=ndb.FloatProperty(default=0.00)

众所周知,正常查询可以如下:

sektorkodu=self.request.get('sektorkodu')
    qall=HesapKalemi.query().order(HesapKalemi.hk)
    for hesap in qall:
        hesap.ho=hesap.A

有没有办法通过这种方式来获取A列:

hesap.GETTHECOLUMN('A') or
hesap.GETTHECOLUMN(sektorkodu)

我有一个非常水平的表,想通过 .GETTHECOLUMN('string') 方法在没有 if-else 结构的情况下查询它。

有这种方法吗?

【问题讨论】:

    标签: python google-app-engine app-engine-ndb


    【解决方案1】:

    在 NDB 世界中,这称为Projection, or a Projection Query。在该文档的链接中,您将看到以下内容:

    投影查询类似于以下形式的 SQL 查询:

    SELECT name, email, phone FROM CUSTOMER
    

    因此,您所追求的 .GETTHECOLUMN('A') 方法看起来像以下任何一种:

    qall_option_one = HesapKalemi.query().order(HesapKalemi.hk).fetch(projection=['A'])
    qall_option_two = HesapKalemi.query().order(HesapKalemi.hk).fetch(projection=[HasepKalemi.A])
    
    # to access the values
    for hesap in qall_option_one:
        print hesap
    
    # output:
    # HesapKalemi(key=Key('HesapKalemi', 1234567890), A=0.00, _projection=('A',))
    # HesapKalemi(key=Key('HesapKalemi', 1234567891), A=0.00, _projection=('A',))
    # ...
    

    这比获取具有所有属性的完整实体要快一些,但之后您仍然需要遍历它们,即使您只想生成“A”值的列表。您应该查看的另一个选项是"Calling a Function For Each Entity (Mapping)",您可以在其中定义一个回调函数,以便在查询运行时在每个实体上调用。因此,假设您只想要一个“A”值列表。您可以像这样形成该列表:

    def callback(hesap):
        return hesap.A
    
    a_values = HesapKelami.query().map(callback)
    # a_values = [0.00, 0.00, ...]
    

    如果您真的追求性能,请查看asynchronous gets

    注意:您可以使用 GQL 代替投影,但这看起来比使用带有常规 ndb 查询语法 IMO 的投影更混乱/更令人困惑。

    编辑:要在评论中回答您的问题,您可以使用投影或映射从多个属性中选择数据。

    多个属性的投影:

    qall_option_one = HesapKalemi.query().order(HesapKalemi.hk).fetch(projection=['A', 'B', 'C'])
    qall_option_two = HesapKalemi.query().order(HesapKalemi.hk).fetch(projection=[HesapKalemi.A, HesapKalemi.B, HesapKalemi.C])
    # to access the values
    for hesap in qall_option_one:
        print hesap
    
    # output:
    # HesapKalemi(key=Key('HesapKalemi', 1234567890), A=0.00, B=0.00, C=0.00 _projection=('A', 'B', 'C',))
    # HesapKalemi(key=Key('HesapKalemi', 1234567891), A=0.00, B=0.00, C=0.00 _projection=('A', 'B', 'C',))
    # ...
    

    映射以返回多个属性:

    def callback(hesap):
        # this returns a tuple of A,B,C values
        return hesap.A, hesap.B, hesap.C
    
    values = HesapKelami.query().map(callback)
    # values is a list of tuples
    # values = [(0.00, 0.00, 0.00), (0.00, 0.00, 0.00), ...]
    

    编辑#2:重读问题和 cmets 后,我认为您的问题,或至少部分问题,可能是如何使用字符串从模型本身获取属性,而不是如何从模型中提取一列数据存储。要回答这个问题,请使用getattr(hesap, "property_name"),或者,这可能更适合您的需求,使用hesap_dict = hesap.to_dict() 将 hesap 转换为字典。然后你可以这样做:

    property_name = 'some_string'
    hesap = HesapKelami.query().fetch(1)[0]
    hesap_dict = hesap.to_dict()
    property_value = hesap_dict.get(property_name, None)
    

    您可以将hesap_dict 传递给您的 Jinja2 模板,然后我认为您可以完成您在 cmets 中询问的内容。

    【讨论】:

    • 非常感谢您的详细回答。我们可以对多个列使用投影功能吗?
    • 是的,您可以对多列使用投影。您还可以映射一个函数以返回包含多列值的元组/列表/字典。我将编辑答案以包含示例。
    • 感谢您的回复。那么从 Jinja 模板调用呢?有没有办法将实体动态列名称(如 A、B、C)重命名为标准名称,如 DYNAMICCOLUMNNAME 以在 Jinja {{hesap.DYNAMICCOLUMNNAME}} 中调用
    • 我不太确定你在问什么,但听起来你可以从回调函数返回一个字典而不是一个元组,其中字典看起来像 {"column_name_one": hesap.A, "column_name_two": hesap.B, "column_name_three": hesap.C} 然后,在您的 Jinja2 模板中,遍历那些 dicts 的列表?我不确定你在问什么,但你可以通过更详细地研究 Jinja 找到你需要的东西。如果没有,最好问一个关于 Jinja 的新问题。
    • 问题是列名A、B...C根据参数来自URL是灵活的。因此,我无法通过回调映射它。有没有办法将 hesap.A 称为 hesap."A" 或 hesap.FUNC("colunmnname")。我很抱歉延长 cmets。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-06-27
    • 2015-03-26
    • 1970-01-01
    相关资源
    最近更新 更多