如何使用 SQLalchemy 将数据添加到 supabase 中的几何列?

问题描述 投票:0回答:1

我在 supabase 中有下表,其中安装了 postgis 扩展:

create table
  public.prueba (
    id smallint generated by default as identity not null,
    name text null,
    age smallint null,
    created_at timestamp without time zone null,
    punto geography null,
    constraint prueba_pkey primary key (id)
  ) tablespace pg_default;

与此 SQLalchemy 类相关:

class Prueba(Base):
    __tablename__ = "prueba"

    id: Mapped[int] = mapped_column(
        sa.SmallInteger, sa.Identity(start=1), primary_key=True
    )
    name: Mapped[str] = mapped_column(sa.String(50), nullable=False)
    age: Mapped[int] = mapped_column(sa.Integer, nullable=False)
    created_at: Mapped[datetime] = mapped_column(sa.DateTime, default=datetime.now)
    punto: Mapped[WKBElement] = mapped_column(
        Geometry(geometry_type="POINT", srid=4326, spatial_index=True)
    )

我按照this问题的建议使用geoalchemy2,但每次我尝试向此表添加数据时,代码都会失败。

我用来添加数据的代码如下:

prueba = Prueba(
    name="Prueba_2",
    age=5,
    created_at=datetime.now(),
    punto="POINT(-1.0 1.0)",
)

with Session() as session:
    session.add(prueba)
    session.commit()

我以这种方式创建添加数据,因为我遵循了 geoalchemy2 orm 教程,但是当我运行时,我得到了这个异常:

  File "c:...\.venv\Lib\site-packages\sqlalchemy\engine\default.py", line 941, in do_execute
    cursor.execute(statement, parameters)
sqlalchemy.exc.ProgrammingError: (psycopg2.errors.UndefinedFunction) function st_geomfromewkt(unknown) does not exist
LINE 1: ...a_2', 5, '2024-12-28T18:49:07.130429'::timestamp, ST_GeomFro...
                                                             ^
HINT:  No function matches the given name and argument types. You might need to add explicit type casts.

[SQL: INSERT INTO prueba (name, age, created_at, punto) VALUES (%(name)s, %(age)s, %(created_at)s, ST_GeomFromEWKT(%(punto)s)) RETURNING prueba.id]
[parameters: {'name': 'Prueba_2', 'age': 5, 'created_at': datetime.datetime(2024, 12, 28, 18, 49, 7, 130429), 'punto': 'POINT(-1.0 1.0)'}]
(Background on this error at: https://sqlalche.me/e/20/f405)

我猜这个错误是我定义类的方式造成的,因为当我将

punto
值留空时,会出现相同的错误。

我还尝试使用与this教程类似的方法,并尝试使用以下代码添加数据:

punto=WKBElement("POINT(10 25)", srid=4326),

给了我一个不同的错误:

 File "c:\...\back\main.py", line 16, in main
    punto=WKBElement("POINT(10 25)", srid=4326),
          ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
  File "c:\...\.venv\Lib\site-packages\geoalchemy2\elements.py", line 201, in __init__
    header = binascii.unhexlify(data[:18])
             ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
binascii.Error: Non-hexadecimal digit found
python sqlalchemy orm supabase geoalchemy2
1个回答
0
投票

好吧,经过一番挖掘,我找到了解决方案。我不知道这是否是最好的解决方案,但它确实有效。

在supabase中,我在gis模式上安装了postgis扩展,所以我使用

sqlalchemy.sql.expression.func
和以下代码:

prueba = Prueba(
    name="Prueba_3",
    age=5,
    created_at=datetime.now(),
    punto=func.gis.st_geogfromtext("SRID=4326;POINT(-73.935242 40.730610)"),
)

with Session() as session:
    session.add_all([prueba])
    session.commit()

SQLalchemy 执行的原始 SQL 我可以看到它直接调用 gis 模式中的函数

st_geogfromtext

© www.soinside.com 2019 - 2024. All rights reserved.