【问题标题】:Python Flask Sqlalchemy Subst QueryPython Flask Sqlalchemy Subst 查询
【发布时间】:2016-10-05 18:27:18
【问题描述】:

我正在我的公司使用烧瓶和 sqlalchemy(sqlite) 用 python 编写内部搜索引擎。我目前的问题是我想这样做。

A.) 查询描述字段的一定数量的信息 B.) 最好在 50 个字符之前和之后进行查询。

在链接字段下与 google 非常相似。如果您搜索某些内容,它会返回下面有 100 个字符的链接。

我正在阅读文档,发现 sqlalchemy 中没有 mid() 函数。我还从这篇文章中注意到 sqlalchemy 仅支持 max、min 和 avg sqlalchemy: get max/min/avg values from a table

函数的 SQL 文档 http://docs.sqlalchemy.org/en/latest/core/functions.html

我试图实现一个查询,例如

links = Item.query(func.mid(Item.description, 0, 200).like('%helloworld%'))

我发布的 sqlite 有语法 Substr 并尝试过 Item.query.filter(func.substr(Item.description,0, 200) == '%helloworld%')

在 sqlalchemy 中有没有办法解决这个问题?

我的代码:

from sqlalchemy.sql.functions import func

def mainSearch(searchterm):
    links = Item.query(func.mid(Item.title, 1, 3).Item.title.like('%e%'))
    return links

HTML/Jinja 代码:

 {% for link in links.items %}

<div id="resultbox">

         <div id="linkTitle"><h4><a href="{{ link.link }}">{{ link.title }}</a></h4> </div>
         <div id="lastUpdated">Last Updated: {{ link.last_updated }} </div>
         <div id="linkLink">{{ link.link }}</div>
             <div id="linkDescription">{{ link.description | safe }}</div>
</div>

错误

TypeError: 'BaseQuery' 对象不可调用

我的数据库: Sqlite

我也想用类似的sql查询:

SELECT MID(column_name,start,length) AS some_name FROM table_name; 

总的来说,我正在尝试对我们在列描述中查询的数据执行此操作:

示例文字:

冠词(缩写为 ART)是一个词(前缀或后缀),与名词一起使用,表示名词所指的类型。冠词指定名词的语法确定性,在某些语言中扩展到体积或数字范围。英语中的冠词是 the and a/an, and (in certain contexts) some。 “an”和“a”是古英语“an”的现代形式,在盎格鲁方言中是数字“one”(比较撒克逊方言中的“on”),并在现代苏格兰语中作为数字“owan”幸存下来。 “on”(诺曼人改写为“one”)和“an”都在现代英语中幸存下来,“one”用作数字,“an”(“a”,在以辅音开头的名词之前)作为不定冠词。

在许多语言中,冠词是一种特殊的词性,不能轻易地与其他词性组合。在英语中,冠词通常被认为是更广泛的语音类别的一部分,称为限定词,它结合了冠词和指示词(例如“this”和“that”)。

在使用冠词的语言中,除了某些例外,每个普通名词都以一定的确定性(例如,定的或不定的)来表达,就像许多语言用特定的语法数字(例如,单数或复数)来表达每个名词一样.每个名词必须伴随冠词,如果有的话,对应于它的确定性,并且缺少冠词(被认为是零冠词)本身就指定了一定的确定性。这与其他形容词和限定词形成对比,后者通常是可选的。冠词的这种强制性使其成为许多语言中最常用的词之一——例如,在英语中,最常用的词是 the。[1]

冠词通常被定性为确定的或不定的。[2]少数具有完善的冠词系统的语言可能会区分其他子类型。在每种类型中,根据性别、数字或大小写等语法属性,或根据相邻的声音,语言的每篇文章可能有不同的形式。

到此

冠词(缩写为 ART)是一个词(前缀或后缀),与名词一起使用,表示名词所指的类型。冠词指明名词的语法确定性,

所以它不会通过抓取 100,000 字长的文本而导致数据库崩溃。我只需要前 100 个

【问题讨论】:

  • 这是用于 SQL 数据库的,对吗?不是 Postgres 或 MySQL?
  • SQLAlchemy 不会“实现”您列出的任何函数。 func 是通用的(具有一些可移植性支持)并生成您向其抛出的任何 SQL 函数表达式。您正在使用什么数据库,它是否具有您希望使用的 mid 功能?此外,如果您有错误,请包括它和完整的回溯。
  • 来自文档“任何名称都可以赋予 func。如果 SQLAlchemy 不知道函数名称,它将完全按原样呈现。”

标签: python sql sqlalchemy flask-sqlalchemy


【解决方案1】:

这与mid 函数无关。错误消息显示'BaseQuery' object is not callable. 你在哪里打电话BaseQuery?这里:

Item.query(...)

正确的咒语是:

db.session.query(func.mid(...))

Item.query.with_entities(func.mid(...))

【讨论】:

  • OperationalError: (sqlite3.OperationalError) no such function: mid [SQL: u'SELECT mid(items.title, ?, ?) LIKE ? AS anon_1 \nFROM items\n LIMIT ? OFFSET ?'] [参数:(1, 3, '%e%', 10, 0)]
  • SQLite 没有mid。它有substr
  • 没有 (func.mid()) 的 Item.query 可以工作,但它会从列中带回大量数据,而我只想要 x 和 y 之间的数据
  • 有人有 substr 修复吗?这似乎是正确的道路
  • func.substr(...)。仔细阅读文档:“任何名称都可以赋予 func。”
猜你喜欢
  • 2013-07-24
  • 1970-01-01
  • 1970-01-01
  • 2019-04-23
  • 2019-12-13
  • 2017-08-28
  • 1970-01-01
  • 2013-04-02
  • 2018-05-09
相关资源
最近更新 更多