首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >peewee :如何根据表中跨行的值筛选表中的数据

peewee :如何根据表中跨行的值筛选表中的数据
EN

Stack Overflow用户
提问于 2019-12-19 13:13:39
回答 2查看 353关注 0票数 3

考虑到下面由peewee支持的python代码,如何根据另一个表中跨行的值筛选表中的数据

例如,如果我想在便笺表中得到一个注释,所有的javalambdagenerics标记都在customtags

代码语言:javascript
运行
复制
#!/usr/bin/env python3

import peewee
import datetime

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

class Note(peewee.Model):
    id = peewee.AutoField()
    name = peewee.CharField()
    text = peewee.CharField()
    created = peewee.DateField(default=datetime.date.today)

    class Meta:

        database = db
        db_table = 'notes'

class CustomTag(peewee.Model):
    id = peewee.AutoField()
    note = peewee.ForeignKeyField(Note, backref='notes')
    tag = peewee.CharField()

    class Meta:

        database = db
        db_table = 'customtags'
        indexes = ((("note_id", "tag"), True),)

Note.drop_table()
CustomTag.drop_table()
Note.create_table()
CustomTag.create_table()

note1 = Note.create(name="note1",text='Java 8 lambda with generics')
note1.save()
CustomTag.insert(note=note1, tag='java').on_conflict_ignore(True)
CustomTag.insert(note=note1, tag='lambda').on_conflict_ignore(True)
CustomTag.insert(note=note1, tag='generics').on_conflict_ignore(True)

note2 = Note.create(name="note2",text='Core Java concepts',
        created=datetime.date(2018, 10, 20))
note2.save()
CustomTag.insert(note=note2, tag='java').on_conflict_ignore(True)

note3 = Note.create(name="note3",text='Java collection framework',
        created=datetime.date(2018, 10, 22))
note3.save()
CustomTag.insert(note=note3, tag='java').on_conflict_ignore(True)

note4 = Note.create(name="note4",text='Java NIO packageJava nio package')
note4.save()
CustomTag.insert(note=note4, tag='java').on_conflict_ignore(True)

notes = Note.select().join(CustomTag, peewee.JOIN.LEFT_OUTER,on=(Note.id == CustomTag.note_id)).order_by(Note.name)

for note in notes:
    print('{} with text {} on {}'.format(note.name, note.text, note.created))

我真的不知道如何修改我的代码--得到上面提到的数据,我知道问题在下面的代码中

代码语言:javascript
运行
复制
notes = Note.select().join(CustomTag, peewee.JOIN.LEFT_OUTER,on=(Note.id == CustomTag.note_id)).order_by(Note.name)
EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2019-12-19 16:41:45

例如,如果我想在便笺表中得到一个注释,在定制标签中包含所有的java、lambda、泛型标记

代码语言:javascript
运行
复制
tags = ['foo', 'bar', 'baz']
query = (Note
         .select()
         .join(CustomTag)
         .where(CustomTag.tag.in_(tags))
         .group_by(Note)
         .having(fn.COUNT(CustomTag.id) == len(tags)))
票数 4
EN

Stack Overflow用户

发布于 2019-12-19 19:03:37

插入语句中似乎缺少execute()。每一行都要更正.

代码语言:javascript
运行
复制
CustomTag.insert(note=note1, tag='java').on_conflict_ignore(True).execute()

我在这里包括了一些改进版的coleifer答案,结果也包括标签列表.

代码语言:javascript
运行
复制
from peewee import fn 

filter_tags = ['java', 'lambda', 'generics']
notes = (Note
         .select(Note, fn.GROUP_CONCAT(CustomTag.tag,',').alias('tags'))
         .join(CustomTag)
         .where(CustomTag.tag.in_(filter_tags))
         .group_by(Note)
         .having(fn.COUNT(CustomTag.id) >= len(filter_tags)))

for note in notes:
    print(f'name : {note.name} text: {note.text} tags: {note.tags} created : {note.created}')
票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/59410522

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档