使用Drizzle ORM连接Turso数据库遇问题,求建表指导
解决Turso+Drizzle连接及写入报错问题
报错原因直白解释
你碰到的TypeError: Cannot read properties of undefined (reading 'Symbol(drizzle:Columns)')错误,本质是两个问题叠加:
- 你定义的
tips表结构不符合Drizzle的要求,导致程序识别不出表的列信息; - 你的Turso数据库里根本还没创建
tips表,就算结构对了也没地方写数据。
下面一步步解决所有问题:
第一步:配置Turso数据库连接
1. 安装必要依赖
先在项目里装Drizzle和Turso的客户端工具:
npm install drizzle-orm @libsql/client drizzle-kit
2. 创建数据库连接文件
在项目里新建db/index.js(用TS就建.ts),写入以下代码:
import { createClient } from '@libsql/client'; import { drizzle } from 'drizzle-orm/libsql'; // 从环境变量读取Turso的连接信息,你需要先去Turso控制台创建数据库,拿到URL和认证令牌 const client = createClient({ url: process.env.TURSO_DB_URL, authToken: process.env.TURSO_DB_AUTH_TOKEN, }); export const db = drizzle(client);
3. 设置环境变量
在项目根目录新建.env文件,填入你的Turso数据库信息:
TURSO_DB_URL=你的Turso数据库URL TURSO_DB_AUTH_TOKEN=你的Turso数据库认证令牌
第二步:正确定义tips表结构
新建db/schema/tips.js(或.ts),用Drizzle的规范定义表结构,这样程序才能识别列:
import { sql } from 'drizzle-orm'; import { sqliteTable, text } from 'drizzle-orm/sqlite-core'; // 定义tips表,括号里的'tips'是数据库里的表名 export const tips = sqliteTable('tips', { id: text('id').primaryKey(), // id字段,作为主键 textContent: text('text_content').notNull(), // 文本内容,不能为空 tag: text('tag').notNull(), // 标签字段,不能为空 createdAt: text('created_at').default(sql`CURRENT_TIMESTAMP`), // 可选:自动记录创建时间 });
注意:必须用Drizzle提供的sqliteTable和字段类型(比如text)来定义,不能自己随便写对象,不然程序识别不了列,还是会报错。
第三步:初始化数据库表
现在数据库里还没有tips表,用Drizzle Kit自动创建:
1. 添加脚本到package.json
打开package.json,在scripts里加一行:
{ "scripts": { "db:push": "drizzle-kit push:sqlite" } }
2. 执行创建表的命令
在终端运行:
npm run db:push
这个命令会读取你定义的表结构,自动在Turso数据库里创建tips表。
第四步:修复写入函数
现在你的createTip函数可以正常工作了,建议加个错误捕获方便排查问题:
"use server" import { db } from "./db"; import { tips } from './db/schema/tips'; export async function createTip(textContent, tag) { try { const tipDetails = { id: crypto.randomUUID(), textContent, tag, }; await db.insert(tips).values(tipDetails); return { success: true }; } catch (error) { console.error('写入数据失败:', error); return { success: false, error: error.message }; } }
内容的提问来源于stack exchange,提问作者Ethan Deardorff
相关产品推荐
相关产品推荐

