【问题标题】:Substring from select in Peewee ORMPeewee ORM中选择的子字符串
【发布时间】:2019-10-08 21:54:16
【问题描述】:

我正在将我的程序的代码库从 Peewee v2 更新到 v3。 在代码中,我在 select 语句中执行了一个子字符串,该语句在 v2 中始终有效,但现在不再有效。 我有下表

class Project(BaseModel):
project_id = CharField(column_name='projectID', primary_key=True)
name = CharField()
relative_path = CharField()
product_id = ForeignKeyField(column_name='productID', model=Product, field='product_id')

class Meta:
    table_name = 'project'
    indexes = (
        (('name', 'product_id'), True),
    )

我的查询如下:

project_prefix = "INH"

query = internal_projects = Project.select(fn.substring(Project.project_id, len(project_prefix) + 1))\
.where(Project.project_id.startswith(project_prefix))

for q in query:
    print q

这给了我结果:

None
None
None
None
None
None
None

但是,如果我将 fn.substring 排除在查询之外,结果会很好,例如:

INH00001
INH00002
INH00004
INH00005
INH00006
INH00007
INH00008

我从第一个查询中得到“无”的次数确实与第二个查询的结果数量相匹配,所以它肯定选择了一些东西。如何使我的第一个查询再次工作,以便获得预期的结果?例如:

00001
00002
00004
00005
00006
00007
00008

【问题讨论】:

    标签: python peewee


    【解决方案1】:

    我猜你访问属性的方式有些奇怪。尝试明确指定别名:

    pid = fn.substring(Project.project_id, len(prefix + 1))
    query = (Project
             .select(pid.alias('pid'))
             .where(Project.project_id.startswith(prefix)))
    
    for project in query:
        print(project.pid)
    

    【讨论】:

    • 谢谢,这行得通。作为一个很好的副作用,我认为您的示例更具可读性。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-08-10
    • 1970-01-01
    • 2019-05-01
    • 2015-07-14
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多