Skip to content

[BUG]: Spatial Support - Geometry Column #337

Closed
@dylel

Description

@dylel

What version of drizzle-orm are you using?

0.22.0-cbee77

Describe the Bug

The geometry column isn't defined yet so i had a go at making it via the MySqlColumnBuilder, worked for db push as my planetscale detected the geoemtry correctly. However when trying to retrieve values from mapFromDriverValue it appears that it's not returning what I would expect from the driver which would be a buffer. Can someone shed some light on what format/value the driver is actually returning?

driver: @planetscale/database
drizzle wrapper: drizzle-orm/planetscale-serverless

This type may not be supported by @planetscale/database but couldn't find anything that said it wasn't.

Here's my attempt at the geometry column:

import type { ColumnBaseConfig, ColumnConfig } from "drizzle-orm";
import type { ColumnBuilderConfig } from "drizzle-orm/column-builder";
import { MySqlColumn } from "drizzle-orm/mysql-core/columns";
import { MySqlColumnBuilder } from "drizzle-orm/mysql-core/columns/common";
import type { AnyMySqlTable } from "drizzle-orm/mysql-core/table";
import wkx from "wkx";

// Define the builder for the geometry column
export class MySqlGeometryBuilder<
  TData extends wkx.Geometry
> extends MySqlColumnBuilder<
  ColumnBuilderConfig<{ data: TData; driverParam: wkx.Geometry }>
> {
  build<TTableName extends string>(
    table: AnyMySqlTable<{ name: TTableName }>
  ): MySqlGeometry<TTableName, TData> {
    return new MySqlGeometry(table, this.config);
  }
}

export class MySqlGeometry<
  TTableName extends string,
  TData extends wkx.Geometry
> extends MySqlColumn<
  ColumnConfig<{
    tableName: TTableName;
    data: wkx.Geometry;
    driverParam: string;
    notNull: false;
    hasDefault: false;
  }>
> {
  readonly $mySqlColumnBrand!: "MySqlColumn";

  constructor(
    table: AnyMySqlTable<{ name: TTableName }>,
    builder: MySqlGeometryBuilder<TData>["config"]
  ) {
    super(table, builder);
  }

  getSQLType(): string {
    return "GEOMETRY";
  }

  override mapFromDriverValue(value: string): wkx.Geometry {
    //@ts-ignore
    const buffer = value as Buffer;
    console.log("buffer", buffer.toJSON());
    const geometry = wkx.Geometry.parse(buffer);
    console.log("parsed: ", geometry);
    return geometry;
  }

  override mapToDriverValue(value: wkx.Geometry): string {
    if (!value) return "NULL";
    return `ST_GeomFromGeoJSON('${JSON.stringify(value)}')`;
  }
}

export function geometry<T extends wkx.Geometry>(
  name: string
): MySqlGeometryBuilder<T> {
  return new MySqlGeometryBuilder(name);
}

Metadata

Metadata

Assignees

No one assigned

    Labels

    bugSomething isn't working

    Type

    No type

    Projects

    No projects

    Milestone

    No milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions