Closed
Description
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);
}