首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >如何使用geoalchemy2类型的SQLAlchemy @compiles装饰器

如何使用geoalchemy2类型的SQLAlchemy @compiles装饰器
EN

Stack Overflow用户
提问于 2021-05-13 01:03:40
回答 1查看 98关注 0票数 2

我正在尝试从Postgres中创建一个内存中的SQLite数据库,该数据库最初是为Postgres数据库设计的。为了允许SQLite引擎转换postgres特定的数据类型,我依赖于SQLAlchemy @compiles装饰器,它的工作方式与sqlalchemy.dialects.postgresql名称空间中的类型相同。

如何将geoalchemy2.Raster数据类型转换为引擎无关的数据类型(我只关心它可能是sqlalchemy.BLOB类型)。重要的是,我可以创建相似的表,它们不需要精确)?

这个示例代码按预期转换了DOUBLE_PRECISION类型,但是我不知道如何修改作为UserDefinedTypegeoalchemy2.Raster数据类型。我希望能够编写一个类似于compile_DOUBLE_PRECISION()的方法,将Raster转换为BLOB类型。

代码语言:javascript
复制
import sqlalchemy
from sqlalchemy import Column, Integer
from sqlalchemy.dialects.postgresql import DOUBLE_PRECISION
from sqlalchemy.ext.compiler import compiles
from sqlalchemy.ext.declarative import declarative_base
from sqlalchemy.dialects.sqlite.base import SQLiteTypeCompiler
from geoalchemy2 import Raster

Base = declarative_base()

class SomeModel(Base):
    __tablename__ = "some_model"
    id = Column(Integer, primary_key=True)
    double_precision = Column(DOUBLE_PRECISION)
    raster = Column(Raster)

# The following @compiles works as intended
@compiles(DOUBLE_PRECISION, 'sqlite')
def compile_DOUBLE_PRECISION(element, compiler: SQLiteTypeCompiler, **kw):
    """ Handles postgres DOUBLE_PRECISION datatype as REAL in sqlite. """
    return compiler.visit_real(element, **kw)

def test_throws_error_due_to_raster_data_type():
    engine = sqlalchemy.create_engine("sqlite:///:memory:")
    Base.metadata.create_all(engine)
EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2021-05-15 16:17:54

我不熟悉postgresql,但也许这样的东西可以工作

代码语言:javascript
复制
import sqlalchemy as sa
from sqlalchemy.ext.declarative import declarative_base
from geoalchemy2 import Raster

Base = declarative_base()


def raster_if_postgresql_else_blob():
    return sa.BLOB().with_variant(Raster, "postgresql")


class SomeModel(Base):
    __tablename__ = "some_model"
    id = sa.Column(sa.Integer, primary_key=True)
    raster = sa.Column(raster_if_postgresql_else_blob())


lite_engine = sa.create_engine("sqlite:///:memory:", echo=True)
Base.metadata.create_all(lite_engine)
票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/67508059

复制
相关文章

相似问题

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