我正在制作一个简单的日文字符查找应用程序(Kanji),用户可以使用任何可用的信息搜索数据库。在
汉字:
含义(1汉字id可以有多个具有不同含义的条目):
用户可以选择按'id'、'character'、'heisig6'、'kanjiorigin'或'meansing'进行搜索,然后返回所有这些字段中的所有信息。(所有字段只返回一个结果,除了可以返回多个结果的含义之外)
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)
这是一个有效的查询吗?: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”
我们真的必须能够看到你的数据库模式,以给予真正的批评,但假设没有外键,你说的基本上是你能做的最好的。在
然而,当你有复杂的关系时,sql炼金术才真正开始闪耀。例如,如果正确地设置了外键,可以执行以下操作。在
这将返回汉字作为数组的含义,无需进一步查询。在
你可以深入了解关系,所以我在这里链接文档。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
我真的很喜欢我的数据库结构,但其他的都很糟糕。希望它仍然有用。在
相关问题 更多 >
编程相关推荐