tursodatabase / libsql

libSQL is a fork of SQLite that is both Open Source, and Open Contributions.
https://turso.tech/libsql
MIT License
11.58k stars 288 forks source link

migration error #1321

Closed kelbyfaessler closed 7 months ago

kelbyfaessler commented 7 months ago

Using Turso with drizzle + sveltekit. Sveltekit has import aliases like $env, $lib and for that reason, I run scripts using vite-node so imports resolve.

I created a migration and am attempting to migrate using drizzles migrate() function. Here is the libsql/hrana error.

> vite-node --options.transformMode.ssr='/.*/' src/lib/server/migrate.ts

Running migrations...
<project>/node_modules/@libsql/client/lib-esm/hrana.js:264
        return new __vite_ssr_import_1__.LibsqlError(e.message, code, undefined, e);
               ^

LibsqlError: SQL_PARSE_ERROR: SQL string could not be parsed: near LP, "None": syntax error at (5, 37)
    at mapHranaError (<project>/node_modules/@libsql/client/lib-esm/hrana.js:257:16)
    at HttpTransaction.batch (<project>/node_modules/@libsql/client/lib-esm/hrana.js:105:19)
    at processTicksAndRejections (node:internal/process/task_queues:95:5)
    at <project>/node_modules/src/sqlite-core/dialect.ts:799:7
    at LibSQLSession.transaction (<project>/node_modules/src/libsql/session.ts:86:19)
    at SQLiteAsyncDialect.migrate (<project>/node_modules/src/sqlite-core/dialect.ts:795:3)
    at <project>/src/lib/server/migrate.ts:8:1
    at ViteNodeRunner.directRequest (file://<project>/node_modules/vite-node/dist/client.mjs:328:5)
    at ViteNodeRunner.cachedRequest (file://<project>/node_modules/vite-node/dist/client.mjs:186:14)
    at ViteNodeRunner.executeFile (file://<project>/node_modules/vite-node/dist/client.mjs:154:12) {
  code: 'SQL_PARSE_ERROR',
  rawCode: undefined,
  [cause]: [ResponseError: SQL string could not be parsed: near LP, "None": syntax error at (5, 37)] {
    code: 'SQL_PARSE_ERROR',
    proto: {
      message: 'SQL string could not be parsed: near LP, "None": syntax error at (5, 37)',
      code: 'SQL_PARSE_ERROR'
    }
  }
}

Node.js v18.19.1
haaawk commented 7 months ago

Thank you for bringing up the issue @kelbyfaessler . Would you have a code / SQL that reproduces the issue?

kelbyfaessler commented 7 months ago

I played around with the generated SQL and figured out the issue.

The issue is in this part of a table definition

CREATE TABLE `mytable` (
    ...
    `created_at` text DEFAULT strftime('%Y-%m-%dT%H:%M:%fZ', 'now') NOT NULL,
    ...
);

If I put parens around the strftime call, then it works

`created_at` text DEFAULT (strftime('%Y-%m-%dT%H:%M:%fZ', 'now')) NOT NULL,
kelbyfaessler commented 7 months ago

closing the issue since its a drizzle issue with their generated sql

AndriiSherman commented 7 months ago

@kelbyfaessler сan you show the drizzle schema you are using?

kelbyfaessler commented 7 months ago

@AndriiSherman the line in the schema looks like this:

    createdAt: text("created_at").notNull().default(sql`strftime('%Y-%m-%dT%H:%M:%fZ', 'now')`),

which means its not a drizzle issue and rather issue with my own code, right? Since I could insert the parens like so

    createdAt: text("created_at").notNull().default(sql`(strftime('%Y-%m-%dT%H:%M:%fZ', 'now'))`),
haaawk commented 7 months ago

According to my understanding you're right @kelbyfaessler. This is an issue with the code not drizzle itself but @AndriiSherman will know better.

AndriiSherman commented 7 months ago

Author

Yes, so the case here is that if you are using the sql template in the drizzle schema, we can't know exactly what is there because it can be basically anything. It's done to not block you from using anything you need while we are implementing first-class support for a specific feature. So it means anything that is in the sql template will be added after the default as-is, so it is your responsibility to put the right code there, same as you would put in raw sql DDL statement after DEFAULT