SQLalchemy查找id并使用它来查找其他信息

2024-06-16 11:04:19 发布

您现在位置:Python中文网/ 问答频道 /正文

我正在制作一个简单的日文字符查找应用程序(Kanji),用户可以使用任何可用的信息搜索数据库。在

我的数据库结构

汉字

  • 身份证
  • 字符(汉字,如頑)
  • heisig6(表示汉字显示顺序的数字)
  • 汉字起源(表示汉字显示顺序的数字)

含义(1汉字id可以有多个具有不同含义的条目):

  • 汉字id(外键(汉字)引用“汉字”(id)
  • 意义

用户处理

用户可以选择按'id'、'character'、'heisig6'、'kanjiorigin'或'meansing'进行搜索,然后返回所有这些字段中的所有信息。(所有字段只返回一个结果,除了可以返回多个结果的含义之外)

代码,编辑4+5:我的代码感谢IRC上的@apolfortyne和#sqlalchemy,编辑6:join-->;outerjoin(否则找不到没有来源的信息)

import sqlalchemy as sqla
import sqlalchemy.orm as sqlo
from tableclass import TableKanji, TableMeaningEN, TableMisc, TableOriginKanji  # See tableclass.py

# Searches database with argument search method
class SearchDatabase():
    def __init__(self):
        #self.db_name = "sqlite:///Kanji_story.db"
        self.engine = sqla.create_engine("sqlite:///Kanji.db", echo=True)

        # Bind the engine to the metadata of the Base class so that the
        # declaratives can be accessed through a DBSession instance
        tc.sqla_base.metadata.bind = self.engine

        # For making sessions to connect to db
        self.db_session = sqlo.sessionmaker(bind=self.engine)

    def retrieve(self, s_input, s_method):
        # s_input: search input
        # s_method: search method
        print("\nRetrieving results with input: {} and method: {}".format(s_input, s_method))

        data = []  # Data to return

        # User searches on non-empty string
        if s_input:
            session = self.db_session()

            # Find id in other table than Kanji
            if s_method == 'meaning':
                s_table = TableMeaningEN  # 'MeaningEN'
            elif s_method == 'okanji':
                s_table = TableOriginKanji  # 'OriginKanji'
            else:
                s_table = TableKanji  # 'Kanji'

            result = session.query(TableKanji).outerjoin(TableMeaningEN).outerjoin(
                (TableOriginKanji, TableKanji.origin_kanji)
            ).filter(getattr(s_table, s_method) == s_input).all()
            print("result: {}".format(result))
            for r in result:
                print("r: {}".format(r))

                meanings = [m.meaning for m in r.meaning_en]
                print(meanings)
                # TODO transform into origin kanji's
                origins = [str(o.okanji_id) for o in r.okanji_id]
                print(origins)

                data.append({'character': r.character, 'meanings': meanings,
                             'indexes': [r.id, r.heisig6, r.kanjiorigin], 'origins': origins})

            session.close()

        if not data:
            data = [{'character': 'X', 'meanings': ['invalid', 'search', 'result']}]
        return(data)

问题编辑4+5

  • 这是一个有效的查询吗?:result = session.query(TableKanji).join(TableMeaningEN).filter(getattr(s_table, s_method) == s_input).all()(必须使用.join语句,否则例如session.query(TableKanji).filter(TableMeaningEN.meaning == 'love').all()会由于某种原因返回数据库中的所有含义?那么这是正确的查询还是我的relationship()在my中表格类.py没有正确定义?

  • 已修复(请参阅中的lambda:)表格类.py)kanji = relationship("TableKanji", foreign_keys=[kanji_id], back_populates="OriginKanji")<;--这有什么不对?它给出了错误:

    文件“/路径/python3.5/site-packages/sqlalchemy/orm/映射器.py“,第1805行,在get_属性中 映射器'%s'没有属性'%s'(self,key)

    在sqlalchemy.exc.InvalidRequestError:Mapper'Mapper | TableKanji | Kanji'没有属性“OriginKanji”

编辑2:表格类.py(编辑3+4+5:更新)

^{pr2}$

Tags: pyselfid编辑inputdbsqlalchemysession
1条回答
网友
1楼 · 发布于 2024-06-16 11:04:19

我们真的必须能够看到你的数据库模式,以给予真正的批评,但假设没有外键,你说的基本上是你能做的最好的。在

然而,当你有复杂的关系时,sql炼金术才真正开始闪耀。例如,如果正确地设置了外键,可以执行以下操作。在

# Assuming kanji is a tc.tableMeaningEN.kanji_id object
kanji_meaning = kanji.meanings

这将返回汉字作为数组的含义,无需进一步查询。在

你可以深入了解关系,所以我在这里链接文档。http://docs.sqlalchemy.org/en/latest/orm/relationships.html

编辑:实际上,你根本不需要手动加入,SQLAlchemy会帮你完成的。在

你的类的大小写是错误的,但是我不确定SQLAlchemy是否区分大小写。如果成功了,那就继续吧。在

如果查询a表(self.session.query(用户).filter(用户名== 自身名称).first())您应该有一个表类型的对象(这里是User)。在

所以在您的例子中,单独查询TableKanji表将返回一个该类型的对象。在

^{pr2}$

我有一个项目利用了这些功能,希望它能帮助: https://github.com/ApolloFortyNine/SongSense 数据库声明(带关系):https://github.com/ApolloFortyNine/SongSense/blob/master/songsense/database.py 自动联接:https://github.com/ApolloFortyNine/SongSense/blob/master/songsense/getfriend.py#L134

我真的很喜欢我的数据库结构,但其他的都很糟糕。希望它仍然有用。在

相关问题 更多 >