Turso Database Querying
Complete solution for querying Turso databases using Platform API token to generate database-specific tokens. Demonstrates proper authentication workflow: Platform API ā Database Token ā Query Data. Lists all databases, creates proper tokens, and queries table data with sample results. Perfect for developers working with Turso/LibSQL databases who need to understand the correct authentication flow.

Created by
andrew van beek - Keyboard Team
Requirements
KEYBOARD_TURSO_DATABASE_TOKEN
Script
Copy script
Copied
Copy script
Copied
const axios = require('axios'); const { createClient } = require('@libsql/client'); console.log('š§ Turso Database Query with Proper Authentication'); console.log('===================================================\n'); const platformToken = process.env.KEYBOARD_TURSO_DATABASE_TOKEN; if (!platformToken) { console.error('ā KEYBOARD_TURSO_DATABASE_TOKEN environment variable not found'); console.error('Please ensure your Platform API token is properly configured'); return; } // Configuration from variables const maxRows = {{maxRowsPerTable}} || 5; const showSchema = {{showTableSchema}} !== false; const targetOrg = '{{organizationName}}' || null; const targetDb = '{{databaseName}}' || null; try { // Step 1: Get user information console.log('š Step 1: Authenticating with Platform API...'); const userResponse = await axios.get('https://api.turso.tech/v1/current-user', { headers: { 'Authorization': `Bearer ${platformToken}` } }); const username = userResponse.data.user.username; const orgToUse = targetOrg || username; console.log(`ā Platform API access successful!`); console.log(`š¤ User: ${userResponse.data.user.name} (@${username})`); console.log(`š§ Email: ${userResponse.data.user.email}`); console.log(`š¢ Using organization: ${orgToUse}\n`); // Step 2: List databases console.log('š Step 2: Listing available databases...'); const dbResponse = await axios.get(`https://api.turso.tech/v1/organizations/${orgToUse}/databases`, { headers: { 'Authorization': `Bearer ${platformToken}` } }); const databases = dbResponse.data.databases; console.log(`ā Found ${databases.length} database(s):`); databases.forEach((db, index) => { console.log(` ${index + 1}. ${db.Name} (${db.regions.join(', ')})`); }); if (databases.length === 0) { console.log('ā No databases found in organization'); return; } // Step 3: Select database to query let databaseToQuery; if (targetDb) { databaseToQuery = databases.find(db => db.Name === targetDb); if (!databaseToQuery) { console.log(`ā Database '${targetDb}' not found. Available databases:`); databases.forEach(db => console.log(` ⢠${db.Name}`)); return; } } else { databaseToQuery = databases[0]; // Use first database } console.log(`\nšÆ Selected database: ${databaseToQuery.Name}`); console.log(` URL: libsql://${databaseToQuery.Hostname}`); console.log(` Regions: ${databaseToQuery.regions.join(', ')}\n`); // Step 4: Generate database-specific token console.log('š Step 3: Creating database-specific authentication token...'); const tokenResponse = await axios.post( `https://api.turso.tech/v1/organizations/${orgToUse}/databases/${databaseToQuery.Name}/auth/tokens`, {}, { headers: { 'Authorization': `Bearer ${platformToken}` } } ); const databaseToken = tokenResponse.data.jwt; console.log('ā Database token generated successfully!\n'); // Step 5: Connect and query database console.log('š Step 4: Connecting to database and querying data...'); const client = createClient({ url: `libsql://${databaseToQuery.Hostname}`, authToken: databaseToken }); // List all user tables const tablesResult = await client.execute("SELECT name FROM sqlite_master WHERE type='table' AND name NOT LIKE 'sqlite_%';"); console.log(`ā Database connection successful!`); console.log(`š Found ${tablesResult.rows.length} user table(s):\n`); if (tablesResult.rows.length === 0) { console.log(' š Database contains no user tables (empty database)'); } else { // Query each table for (const tableRow of tablesResult.rows) { const tableName = tableRow.name; console.log(`šļø Table: ${tableName}`); try { // Get table schema if requested if (showSchema) { const schemaResult = await client.execute(`PRAGMA table_info("${tableName}");`); console.log(` š Schema:`); schemaResult.rows.forEach(col => { const nullable = col.notnull ? 'NOT NULL' : 'NULLABLE'; const pk = col.pk ? ' (PRIMARY KEY)' : ''; console.log(` ${col.name}: ${col.type} ${nullable}${pk}`); }); } // Get row count const countResult = await client.execute(`SELECT COUNT(*) as count FROM "${tableName}";`); const totalRows = countResult.rows[0].count; console.log(` š Total rows: ${totalRows}`); if (totalRows > 0) { // Get sample data const dataResult = await client.execute(`SELECT * FROM "${tableName}" LIMIT ${maxRows};`); console.log(` š Sample data (showing ${Math.min(dataResult.rows.length, maxRows)} of ${totalRows} rows):`); dataResult.rows.forEach((row, index) => { console.log(` [${index + 1}] ${JSON.stringify(row)}`); }); if (totalRows > maxRows) { console.log(` ... and ${totalRows - maxRows} more rows`); } } else { console.log(` š Table is empty`); } console.log(''); // Add spacing between tables } catch (tableError) { console.log(` ā Error querying table ${tableName}: ${tableError.message}\n`); } } } // Summary console.log('š Query completed successfully!\n'); console.log('š Summary:'); console.log(` ⢠Database: ${databaseToQuery.Name}`); console.log(` ⢠Tables found: ${tablesResult.rows.length}`); console.log(` ⢠Authentication: Platform API ā Database Token ā Query`); console.log('\nš” Key Points:'); console.log(' ā Platform API token works for database management'); console.log(' ā Database-specific tokens required for queries'); console.log(' ā This is the correct and secure authentication flow'); } catch (error) { console.error('ā Error during execution:', error.response?.status || error.message); if (error.response?.data) { console.error('š Error details:', JSON.stringify(error.response.data, null, 2)); } console.error('\nš§ Troubleshooting:'); console.error(' ⢠Ensure KEYBOARD_TURSO_DATABASE_TOKEN is a valid Platform API token'); console.error(' ⢠Verify you have access to the specified organization/database'); console.error(' ⢠Check that the database exists and is not archived'); }