GVKun编程网logo

使用SQLAlchemy的PostgreSQL ILIKE查询

13

本文的目的是介绍使用SQLAlchemy的PostgreSQLILIKE查询的详细情况,我们将通过专业的研究、有关数据的分析等多种方式,同时也不会遗漏关于postgresql–PythonSQLAlc

本文的目的是介绍使用SQLAlchemy的PostgreSQL ILIKE查询的详细情况,我们将通过专业的研究、有关数据的分析等多种方式,同时也不会遗漏关于postgresql – Python SQLAlchemy:映射PostGIS geom字段、postgresql – sqlalchemy中的点类型?、postgresql – SQLAlchemy声明式:定义触发器和索引(Postgres 9)、postgresql – SQLAlchemy复合类型的知识。

本文目录一览:

使用SQLAlchemy的PostgreSQL ILIKE查询

使用SQLAlchemy的PostgreSQL ILIKE查询

我想运行一个查询,以选择标题匹配的所有不区分大小写的帖子''%'' + [some_phrase] + ''%''。也就是说,选择标题 包含
某些短语(不区分大小写)的所有行。从我完成的研究来看,我似乎需要使用Postgres的ILIKE查询来匹配不区分大小写的代码。如何使用SQLAlchemy执行类似的查询?

class Post(db.Model):    id = db.Column(db.Integer, primary_key = True)    title = db.Column(db.String(250))    content = db.Column(db.String(5000))

答案1

小编典典

我认为应该可以

Post.query.filter(Post.title.ilike(''%some_phrase%''))

http://docs.sqlalchemy.org/en/latest/orm/internals.html?highlight=ilike#sqlalchemy.orm.attributes.QueryableAttribute.ilike

postgresql – Python SQLAlchemy:映射PostGIS geom字段

postgresql – Python SQLAlchemy:映射PostGIS geom字段

sqlAlchemy将DB列映射到 Python中的对象成员. For example:

class User(Base):
    __tablename__ = ''users''
    id = Column(Integer,Sequence(''user_id_seq''),primary_key=True)
    name = Column(String(50))
    fullname = Column(String(50))
    password = Column(String(12))

应该使用哪种类型将PostGIS geom column映射到班级成员?

解决方法

据我所知,sqlAlchemy没有内置方法可以做到这一点.但是,GeoAlchemy2是sqlAlchemy的扩展,它增加了对地理空间字段(点,线,多边形等)的支持:

from sqlalchemy.ext.declarative import declarative_base
from sqlalchemy import Column,Integer,String,Sequence
from geoalchemy2 import Geometry

Base = declarative_base()

class User(Base):
    __tablename__ = ''users''
    id = Column(Integer,primary_key=True)
    name = Column(String(50))
    fullname = Column(String(50))
    password = Column(String(12))
    geom = Column(Geometry(''POINT''))

GeoAlchemy2还提供空间查询功能.从docs开始:

query = session.query(Lake).filter(Lake.geom.ST_Contains(''POINT(4 1)''))

postgresql – sqlalchemy中的点类型?

postgresql – sqlalchemy中的点类型?

我发现这个关于Postgres中的Point类型: http://www.postgresql.org/docs/current/interactive/datatype-geometric.html

是否有sqlAlchemy版本?

我以这种方式存储值:(40.721959482,-73.878993913)

解决方法

您可以使用 geoalchemy2 whis是sqlalchemy的扩展,也可以与flask-sqlalchemy一起使用.

from sqlalchemy import Column
from geoalchemy2 import Geometry
# and import others

class Shop(db.Model):
    # other fields
    coordinates = Column(Geometry(''POINT''))

postgresql – SQLAlchemy声明式:定义触发器和索引(Postgres 9)

postgresql – SQLAlchemy声明式:定义触发器和索引(Postgres 9)

在表的sqlAlchemy类中是否有一种方法来定义/创建该表的触发器和索引?

例如,如果我有一个基本的表,如…

class Customer(DeclarativeBase):
    __tablename__ = 'customers'
    customer_id = Column(Integer,primary_key=True,autoincrement=True)
    customer_code = Column(Unicode(15),unique=True)
    customer_name = Column(Unicode(100))
    search_vector = Column(tsvector) ## *Not sure how do this yet either in sqlalchemy*.

我现在想创建一个触发器来更新“search_vector”

CREATE TRIGGER customers_search_vector_update BEFORE INSERT OR UPDATE
ON customers
FOR EACH ROW EXECUTE PROCEDURE
tsvector_update_trigger(search_vector,'pg_catalog.english',customer_code,customer_name);

然后我想添加该字段也作为索引…

create index customers_search_vector_indx ON customers USING gin(search_vector);

现在,在我从应用程序中进行任何类型的数据库重新生成后,我必须对tsvector列,触发器定义和psql中的索引语句添加列。不是世界的尽头,而是容易忘记一步。我所有关于自动化,所以如果我可以让这一切发生在应用程序设置,然后奖金!

印度直接创造。对于索引= True参数的单列,如下所示:
customer_code = Column(Unicode(15),unique=True,index=True)

但是,如果您想要更好地控制名称和选项,请使用显式的Index()构造:

Index('customers_search_vector_indx',Customer.__table__.c.search_vector,postgresql_using='gin')

也可以创建触发器,但这些触发器仍然需要基于sql并挂接到DDL事件。请参阅Customizing DDL了解更多信息,但代码可能与此类似:

from sqlalchemy import event,DDL
trig_ddl = DDL("""
    CREATE TRIGGER customers_search_vector_update BEFORE INSERT OR UPDATE
    ON customers
    FOR EACH ROW EXECUTE PROCEDURE
    tsvector_update_trigger(search_vector,customer_name);
""")
tbl = Customer.__table__
event.listen(tbl,'after_create',trig_ddl.execute_if(dialect='postgresql'))

Sidenote:我不知道如何配置tsvector数据类型:值得一个单独的问题。

postgresql – SQLAlchemy复合类型

postgresql – SQLAlchemy复合类型

sqlAlchemy是否支持Postgresql的复合类型( http://www.postgresql.org/docs/devel/static/rowtypes.html)?我发现它有类似的东西(sqlalchemy.orm.composite),但据我所知,它对我的​​目的来说还不够好.

我想创建一个单独的类型,例如具有值和货币的金额,然后能够重复引用它,并且可能多次从同一个类引用它:

class Transfer(base):
    __tablename__ = "transfer"
    source_amount = Column(Amount)
    target_amount = Column(Amount)

我见过的所有例子(例如this one)都要求我指定列的名称,这使得上述方法不可能(列名称会发生​​冲突).

此外,我宁愿每个Amount有一列而不是两个(因为没有货币,价值实际上没有多大意义,我宁愿数据库负责永远不要分离或混合它们).似乎Postgres可以做到这一点,我只需要一种方法向sqlAlchemy解释我需要什么.我试过阅读http://docs.sqlalchemy.org/en/latest/core/custom_types.html,但它似乎专注于扩充现有的类型,而不是创建新的复合材料(我不知道在impl下放什么).

也许我应该放弃sqlAlchemy并直接与psycopg2沟通?它有一个psycopg2.extras.register_composite函数,但是一旦我这样做,我仍然不知道如何说服sqlAlchemy识别注册.我可能不得不以某种方式将光标从psycopg2传递给sqlAlchemy,但我不知道该怎么做.

解决方法

sqlalchemy本身不支持postgresql复合类型.

但是,sqlalchemy_utils本机支持postgresql复合类型.

以下是他们的文档中的示例:

from collections import OrderedDict

import sqlalchemy as sa
from sqlalchemy_utils import CompositeType,CurrencyType

class Account(Base):
    __tablename__ = ''account''
    id = sa.Column(sa.Integer,primary_key=True)
    balance = sa.Column(
        CompositeType(
            ''money_type'',[
                sa.Column(''currency'',CurrencyType),sa.Column(''amount'',sa.Integer)
            ]
        )
    )

用法:

session.query(Account).filter(Account.balance.amount > 5000)

今天的关于使用SQLAlchemy的PostgreSQL ILIKE查询的分享已经结束,谢谢您的关注,如果想了解更多关于postgresql – Python SQLAlchemy:映射PostGIS geom字段、postgresql – sqlalchemy中的点类型?、postgresql – SQLAlchemy声明式:定义触发器和索引(Postgres 9)、postgresql – SQLAlchemy复合类型的相关知识,请在本站进行查询。

本文标签: