{"id":"60087a2d-4e3d-4cb8-8c19-3ba87a3069d4","shortId":"yCjeqX","kind":"skill","title":"database-query-and-export","tagline":"Query SQLite, PostgreSQL, and MySQL databases and export results to CSV/JSON. Use when: (1) Extracting data for reports, (2) Database backup and migration, (3) Data analysis workflows, or (4) Automated database queries.","description":"# Database Query and Export\n\nQuery relational databases (SQLite, PostgreSQL, MySQL) and export results to CSV, JSON, or other formats. Essential for data extraction, reporting, backup automation, and analytics pipelines.\n\n## When to use\n\n- Use case 1: When the user asks to query a database and export results\n- Use case 2: When you need to extract data for analysis or reporting\n- Use case 3: For backup and data migration workflows\n- Use case 4: When building automated database monitoring and alerts\n\n## Required tools / APIs\n\n- **SQLite** — Lightweight file-based database (often pre-installed)\n- **PostgreSQL client** — For PostgreSQL databases\n- **MySQL client** — For MySQL/MariaDB databases\n- No external API required\n\nInstall options:\n\n```bash\n# Ubuntu/Debian\nsudo apt-get install -y sqlite3 postgresql-client mysql-client\n\n# macOS\nbrew install sqlite3 postgresql mysql-client\n\n# Node.js (database drivers)\nnpm install better-sqlite3  # SQLite\nnpm install pg              # PostgreSQL\nnpm install mysql2          # MySQL\n```\n\n## Skills\n\n### query_sqlite_to_json\n\nQuery SQLite database and export to JSON format.\n\n```bash\n# Basic query to JSON\nsqlite3 database.db \"SELECT * FROM users LIMIT 10;\" -json\n\n# With pretty formatting using jq\nsqlite3 database.db \"SELECT * FROM users WHERE active=1;\" -json | jq '.'\n\n# Export entire table to JSON file\nsqlite3 database.db \"SELECT * FROM orders;\" -json > orders.json\n\n# Query with WHERE clause\nsqlite3 database.db \"SELECT id, name, email FROM users WHERE created_at > '2024-01-01';\" -json\n```\n\n**Node.js:**\n\n```javascript\nconst Database = require('better-sqlite3');\n\nfunction querySQLiteToJSON(dbPath, query) {\n  const db = new Database(dbPath, { readonly: true });\n  const rows = db.prepare(query).all();\n  db.close();\n  return rows;\n}\n\n// Usage\n// const users = querySQLiteToJSON('./database.db', 'SELECT * FROM users LIMIT 10');\n// console.log(JSON.stringify(users, null, 2));\n```\n\n### query_sqlite_to_csv\n\nQuery SQLite database and export to CSV format.\n\n```bash\n# Basic query to CSV\nsqlite3 database.db <<EOF\n.mode csv\n.headers on\nSELECT * FROM users LIMIT 10;\nEOF\n\n# Export to CSV file\nsqlite3 database.db <<EOF\n.mode csv\n.headers on\n.output users.csv\nSELECT id, name, email, created_at FROM users WHERE active=1;\nEOF\n\n# Query multiple tables with JOIN\nsqlite3 database.db <<EOF\n.mode csv\n.headers on\nSELECT u.name, o.order_id, o.total \nFROM users u \nJOIN orders o ON u.id = o.user_id \nWHERE o.created_at > '2024-01-01';\nEOF\n```\n\n**Node.js:**\n\n```javascript\nconst Database = require('better-sqlite3');\nconst fs = require('fs');\n\nfunction querySQLiteToCSV(dbPath, query, outputPath) {\n  const db = new Database(dbPath, { readonly: true });\n  const rows = db.prepare(query).all();\n  db.close();\n  \n  if (rows.length === 0) {\n    return 'No results';\n  }\n  \n  // Generate CSV\n  const headers = Object.keys(rows[0]).join(',');\n  const csvRows = rows.map(row => \n    Object.values(row).map(val => \n      typeof val === 'string' && val.includes(',') ? `\"${val}\"` : val\n    ).join(',')\n  );\n  \n  const csv = [headers, ...csvRows].join('\\n');\n  \n  if (outputPath) {\n    fs.writeFileSync(outputPath, csv);\n    return `Exported ${rows.length} rows to ${outputPath}`;\n  }\n  \n  return csv;\n}\n\n// Usage\n// querySQLiteToCSV('./database.db', 'SELECT * FROM users LIMIT 10', './users.csv');\n```\n\n### query_postgresql\n\nQuery PostgreSQL database and export results.\n\n```bash\n# Set connection string (alternative: use individual flags)\nexport PGHOST=localhost\nexport PGPORT=5432\nexport PGDATABASE=mydb\nexport PGUSER=postgres\nexport PGPASSWORD=mypassword\n\n# Query to JSON (using psql with formatted output)\npsql -t -A -F\",\" -c \"SELECT row_to_json(t) FROM (SELECT * FROM users LIMIT 10) t;\"\n\n# Query to CSV\npsql -c \"COPY (SELECT * FROM users WHERE active=true) TO STDOUT WITH CSV HEADER;\" > users.csv\n\n# Query with connection string\npsql \"postgresql://user:password@localhost:5432/mydb\" -c \"SELECT * FROM users LIMIT 5;\"\n\n# Query to formatted table\npsql -c \"SELECT id, name, email FROM users ORDER BY created_at DESC LIMIT 10;\"\n```\n\n**Node.js:**\n\n```javascript\nconst { Pool } = require('pg');\n\nasync function queryPostgreSQL(connectionString, query) {\n  const pool = new Pool({ connectionString });\n  \n  try {\n    const result = await pool.query(query);\n    return result.rows;\n  } finally {\n    await pool.end();\n  }\n}\n\n// Usage\n// const connStr = 'postgresql://user:password@localhost:5432/mydb';\n// queryPostgreSQL(connStr, 'SELECT * FROM users LIMIT 10')\n//   .then(rows => console.log(JSON.stringify(rows, null, 2)));\n```\n\n### query_mysql\n\nQuery MySQL/MariaDB database and export results.\n\n```bash\n# Query to CSV with headers\nmysql -h localhost -u root -p'mypassword' -D mydb \\\n  -e \"SELECT * FROM users WHERE active=1;\" \\\n  --batch --silent \\\n  | cat > users.csv\n\n# Query to JSON-like format (requires jq for proper formatting)\nmysql -h localhost -u root -p'mypassword' -D mydb \\\n  -e \"SELECT * FROM users LIMIT 10;\" \\\n  --batch --silent\n\n# Export entire table to CSV\nmysql -h localhost -u root -p'mypassword' -D mydb \\\n  -e \"SELECT * FROM orders INTO OUTFILE '/tmp/orders.csv' \n      FIELDS TERMINATED BY ',' \n      ENCLOSED BY '\\\"' \n      LINES TERMINATED BY '\\n';\"\n\n# Query with timeout\nmysql -h localhost -u root -p'mypassword' -D mydb \\\n  --connect-timeout=10 \\\n  -e \"SELECT COUNT(*) as total FROM users;\"\n```\n\n**Node.js:**\n\n```javascript\nconst mysql = require('mysql2/promise');\n\nasync function queryMySQL(config, query) {\n  const connection = await mysql.createConnection({\n    host: config.host || 'localhost',\n    user: config.user,\n    password: config.password,\n    database: config.database,\n    connectTimeout: 10000\n  });\n  \n  try {\n    const [rows] = await connection.execute(query);\n    return rows;\n  } finally {\n    await connection.end();\n  }\n}\n\n// Usage\n// const config = {\n//   host: 'localhost',\n//   user: 'root',\n//   password: 'mypassword',\n//   database: 'mydb'\n// };\n// queryMySQL(config, 'SELECT * FROM users LIMIT 10')\n//   .then(rows => console.log(JSON.stringify(rows, null, 2)));\n```\n\n### advanced_sqlite_export_with_error_handling\n\nProduction-ready SQLite export with validation and error handling.\n\n```bash\n#!/bin/bash\nDB_PATH=\"database.db\"\nQUERY=\"SELECT * FROM users WHERE active=1;\"\nOUTPUT_FILE=\"users.csv\"\n\n# Check if database exists\nif [ ! -f \"$DB_PATH\" ]; then\n  echo \"Error: Database file not found: $DB_PATH\" >&2\n  exit 1\nfi\n\n# Check if table exists\nif ! sqlite3 \"$DB_PATH\" \"SELECT name FROM sqlite_master WHERE type='table' AND name='users';\" | grep -q \"users\"; then\n  echo \"Error: Table 'users' not found in database\" >&2\n  exit 1\nfi\n\n# Execute query and export to CSV\nif sqlite3 \"$DB_PATH\" <<EOF > \"$OUTPUT_FILE\" 2>&1\n.mode csv\n.headers on\n$QUERY\nEOF\nthen\n  ROW_COUNT=$(wc -l < \"$OUTPUT_FILE\")\n  echo \"Success: Exported $((ROW_COUNT - 1)) rows to $OUTPUT_FILE\"\nelse\n  echo \"Error: Query failed\" >&2\n  exit 1\nfi\n```\n\n**Node.js:**\n\n```javascript\nconst Database = require('better-sqlite3');\nconst fs = require('fs');\n\nasync function exportSQLiteWithValidation(options) {\n  const { dbPath, query, outputPath, format = 'json' } = options;\n  \n  // Validate database exists\n  if (!fs.existsSync(dbPath)) {\n    throw new Error(`Database file not found: ${dbPath}`);\n  }\n  \n  let db;\n  try {\n    db = new Database(dbPath, { readonly: true, timeout: 10000 });\n    \n    // Prepare and execute query\n    const stmt = db.prepare(query);\n    const rows = stmt.all();\n    \n    if (rows.length === 0) {\n      return { success: true, rowCount: 0, message: 'No rows returned' };\n    }\n    \n    // Export based on format\n    let output;\n    if (format === 'json') {\n      output = JSON.stringify(rows, null, 2);\n    } else if (format === 'csv') {\n      const headers = Object.keys(rows[0]).join(',');\n      const csvRows = rows.map(row => \n        Object.values(row).map(val => \n          typeof val === 'string' && val.includes(',') ? `\"${val.replace(/\"/g, '\"\"')}\"` : val\n        ).join(',')\n      );\n      output = [headers, ...csvRows].join('\\n');\n    } else {\n      throw new Error(`Unsupported format: ${format}`);\n    }\n    \n    // Write to file\n    fs.writeFileSync(outputPath, output);\n    \n    return {\n      success: true,\n      rowCount: rows.length,\n      outputPath,\n      format,\n      message: `Exported ${rows.length} rows to ${outputPath}`\n    };\n    \n  } catch (err) {\n    throw new Error(`Database export failed: ${err.message}`);\n  } finally {\n    if (db) db.close();\n  }\n}\n\n// Usage\n// exportSQLiteWithValidation({\n//   dbPath: './database.db',\n//   query: 'SELECT * FROM users WHERE active=1',\n//   outputPath: './users.json',\n//   format: 'json'\n// }).then(result => console.log(result));\n```\n\n## Rate limits / Best practices\n\n- ✅ **Use readonly connections** — Open databases in readonly mode when only querying\n- ✅ **Set connection timeouts** — Use 10-30 second timeouts to prevent hanging\n- ✅ **Validate inputs** — Check that database files/tables exist before querying\n- ✅ **Escape user inputs** — Use parameterized queries to prevent SQL injection\n- ✅ **Handle large datasets** — Use LIMIT/OFFSET for pagination on large tables\n- ✅ **Close connections** — Always close database connections after queries\n- ⚠️ **Secure credentials** — Store database passwords in environment variables, never hardcode\n- ⚠️ **Export file permissions** — Ensure export directories have proper write permissions\n\n## Agent prompt\n\n```text\nYou have database query and export capability. When a user asks to query a database:\n\n1. Identify the database type (SQLite, PostgreSQL, MySQL) from:\n   - File extension (.db, .sqlite, .sqlite3 = SQLite)\n   - Connection string (postgresql://, mysql://)\n   - User specification\n\n2. For SQLite:\n   - Use `sqlite3 database.db \"QUERY\" -json` for JSON output\n   - Use `.mode csv` with `.headers on` for CSV output\n   - Always check if the database file exists first\n\n3. For PostgreSQL:\n   - Use `psql` with connection string or environment variables\n   - Use `COPY ... TO STDOUT WITH CSV HEADER` for CSV export\n   - Export JSON using `row_to_json()` function\n\n4. For MySQL:\n   - Use `mysql` with `-e` flag for queries\n   - Use `--batch --silent` for CSV-like output\n   - Set connection timeout with `--connect-timeout=10`\n\n5. Always:\n   - Validate database/table exists before querying\n   - Use readonly connections when only reading\n   - Handle errors gracefully with clear messages\n   - Sanitize outputs (escape commas in CSV, quote strings)\n\n6. For large datasets:\n   - Add LIMIT clause to queries\n   - Use pagination with OFFSET for very large tables\n   - Warn user if result set is likely to be huge\n```\n\n## Troubleshooting\n\n**Error: \"unable to open database file\"**\n- Symptom: SQLite cannot find or access the database file\n- Solution: Check file path is correct and file has read permissions\n\n**Error: \"connection refused\"**\n- Symptom: Cannot connect to PostgreSQL or MySQL server\n- Solution: Verify host/port are correct, database service is running, and firewall allows connections\n\n**Error: \"authentication failed\"**\n- Symptom: Database rejects username/password\n- Solution: Verify credentials are correct, user has necessary privileges\n\n**Error: \"table does not exist\"**\n- Symptom: Query references non-existent table\n- Solution: List available tables first (`sqlite3 db.db \".tables\"` or `\\dt` in psql)\n\n**CSV output has broken formatting:**\n- Symptom: Commas in data break CSV columns\n- Solution: Properly escape values with commas using quotes, escape existing quotes\n\n**Query takes too long:**\n- Symptom: Query hangs or runs for minutes\n- Solution: Add LIMIT clause, optimize query with indexes, increase timeout\n\n## See also\n\n- [../json-and-csv-data-transformation/SKILL.md](../json-and-csv-data-transformation/SKILL.md) — Transform exported data between formats\n- [../file-tracker/SKILL.md](../file-tracker/SKILL.md) — Track database file changes over time\n- [../chat-logger/SKILL.md](../chat-logger/SKILL.md) — Example of SQLite usage for logging","tags":["database","query","and","export","open","skills","besoeasy","agent-skills","ai-agents","claude-code","clawdbot","clawdbot-skill"],"capabilities":["skill","source-besoeasy","skill-database-query-and-export","topic-agent-skills","topic-ai-agents","topic-claude-code","topic-clawdbot","topic-clawdbot-skill","topic-llm-tools","topic-mcp-server","topic-openai","topic-openclaw","topic-vibe-coding","topic-vibecoding"],"categories":["open-skills"],"synonyms":[],"warnings":[],"endpointUrl":"https://skills.sh/besoeasy/open-skills/database-query-and-export","protocol":"skill","transport":"skills-sh","auth":{"type":"none","details":{"cli":"npx skills add besoeasy/open-skills","source_repo":"https://github.com/besoeasy/open-skills","install_from":"skills.sh"}},"qualityScore":"0.505","qualityRationale":"deterministic score 0.51 from registry signals: · indexed on github topic:agent-skills · 111 github stars · SKILL.md body (11,970 chars)","verified":false,"liveness":"unknown","lastLivenessCheck":null,"agentReviews":{"count":0,"score_avg":null,"cost_usd_avg":null,"success_rate":null,"latency_p50_ms":null,"narrative_summary":null,"summary_updated_at":null},"enrichmentModel":"deterministic:skill-github:v1","enrichmentVersion":1,"enrichedAt":"2026-05-02T12:55:03.314Z","embedding":null,"createdAt":"2026-04-18T22:10:40.363Z","updatedAt":"2026-05-02T12:55:03.314Z","lastSeenAt":"2026-05-02T12:55:03.314Z","tsv":"'-01':255,256,386,387 '-30':1136 '/bin/bash':826 '/chat-logger/skill.md':1524,1525 '/database.db':289,469,1100 '/file-tracker/skill.md':1516,1517 '/g':1050 '/json-and-csv-data-transformation/skill.md':1509,1510 '/tmp/orders.csv':714 '/users.csv':475 '/users.json':1109 '0':421,431,1003,1008,1035 '1':19,72,223,353,661,836,859,894,909,928,940,1107,1217 '10':209,294,328,474,530,583,624,691,739,801,1135,1317 '10000':772,989 '2':24,86,299,631,808,857,892,908,938,1026,1236 '2024':254,385 '3':29,99,1264 '4':34,108,1292 '5':564,1318 '5432':497 '5432/mydb':558,617 '6':1345 'access':1384 'activ':222,352,542,660,835,1106 'add':1349,1498 'advanc':809 'agent':1199 'alert':115 'allow':1421 'also':1508 'altern':488 'alway':1173,1256,1319 'analysi':31,94 'analyt':65 'api':118,141 'apt':149 'apt-get':148 'ask':76,1212 'async':590,753,954 'authent':1424 'autom':35,63,111 'avail':1453 'await':603,609,760,776,782 'backup':26,62,101 'base':123,1014 'bash':145,198,312,484,640,825 'basic':199,313 'batch':662,692,1303 'best':1118 'better':174,264,395,948 'better-sqlite3':173,263,394,947 'break':1472 'brew':161 'broken':1466 'build':110 'c':519,536,559,570 'cannot':1381,1403 'capabl':1208 'case':71,85,98,107 'cat':664 'catch':1084 'chang':1521 'check':840,861,1144,1257,1389 'claus':242,1351,1500 'clear':1335 'client':130,135,156,159,167 'close':1171,1174 'column':1474 'comma':1340,1469,1480 'config':756,786,796 'config.database':770 'config.host':763 'config.password':768 'config.user':766 'connect':486,552,737,759,1122,1132,1172,1176,1232,1270,1311,1315,1327,1400,1404,1422 'connect-timeout':736,1314 'connection.end':783 'connection.execute':777 'connectionstr':593,599 'connecttimeout':771 'connstr':613,619 'console.log':295,627,804,1114 'const':260,270,277,286,391,397,406,413,427,433,448,586,595,601,612,749,758,774,785,944,950,958,994,998,1031,1037 'copi':537,1276 'correct':1393,1414,1434 'count':742,918,927 'creat':252,347,579 'credenti':1180,1432 'csv':52,303,310,316,321,332,338,364,426,449,458,466,534,547,643,698,901,911,1030,1249,1254,1280,1283,1307,1342,1463,1473 'csv-like':1306 'csv/json':16 'csvrow':434,451,1038,1055 'd':653,684,706,734 'data':21,30,59,92,103,1471,1513 'databas':2,11,25,36,38,44,80,112,124,133,138,169,192,261,273,306,392,409,480,636,769,793,842,851,891,945,966,974,984,1089,1124,1146,1175,1182,1204,1216,1220,1260,1377,1386,1415,1427,1519 'database-query-and-export':1 'database.db':204,217,233,244,318,335,361,829,1241 'database/table':1321 'dataset':1163,1348 'db':271,407,827,846,855,867,904,980,982,1095,1228 'db.close':282,418,1096 'db.db':1457 'db.prepare':279,415,996 'dbpath':268,274,403,410,959,970,978,985,1099 'desc':581 'directori':1194 'driver':170 'dt':1460 'e':655,686,708,740,1298 'echo':849,884,923,934 'els':933,1027,1058 'email':248,346,574 'enclos':718 'ensur':1192 'entir':227,695 'environ':1185,1273 'eof':319,329,336,354,362,388,915 'err':1085 'err.message':1092 'error':813,823,850,885,935,973,1061,1088,1332,1373,1399,1423,1439 'escap':1151,1339,1477,1483 'essenti':57 'exampl':1526 'execut':896,992 'exist':843,864,967,1148,1262,1322,1443,1449,1484 'exit':858,893,939 'export':5,13,41,49,82,194,226,308,330,460,482,492,495,498,501,504,638,694,811,819,899,925,1013,1079,1090,1189,1193,1207,1284,1285,1512 'exportsqlitewithvalid':956,1098 'extens':1227 'extern':140 'extract':20,60,91 'f':518,845 'fail':937,1091,1425 'fi':860,895,941 'field':715 'file':122,231,333,838,852,907,922,932,975,1067,1190,1226,1261,1378,1387,1390,1395,1520 'file-bas':121 'files/tables':1147 'final':608,781,1093 'find':1382 'firewal':1420 'first':1263,1455 'flag':491,1299 'format':56,197,213,311,513,567,671,676,962,1016,1020,1029,1063,1064,1077,1110,1467,1515 'found':854,889,977 'fs':398,400,951,953 'fs.existssync':969 'fs.writefilesync':456,1068 'function':266,401,591,754,955,1291 'generat':425 'get':150 'grace':1333 'grep':880 'h':647,678,700,728 'handl':814,824,1161,1331 'hang':1141,1492 'hardcod':1188 'header':322,339,365,428,450,548,645,912,1032,1054,1251,1281 'host':762,787 'host/port':1412 'huge':1371 'id':246,344,370,381,572 'identifi':1218 'increas':1505 'index':1504 'individu':490 'inject':1160 'input':1143,1153 'instal':128,143,151,162,172,178,182 'javascript':259,390,585,748,943 'join':359,375,432,447,452,1036,1052,1056 'jq':215,225,673 'json':53,189,196,202,210,224,230,237,257,509,523,669,963,1021,1111,1243,1245,1286,1290 'json-lik':668 'json.stringify':296,628,805,1023 'l':920 'larg':1162,1169,1347,1360 'let':979,1017 'lightweight':120 'like':670,1308,1368 'limit':208,293,327,473,529,563,582,623,690,800,1117,1350,1499 'limit/offset':1165 'line':720 'list':1452 'localhost':494,557,616,648,679,701,729,764,788 'log':1531 'long':1489 'maco':160 'map':439,1043 'master':873 'messag':1009,1078,1336 'migrat':28,104 'minut':1496 'mode':320,337,363,910,1127,1248 'monitor':113 'multipl':356 'mydb':500,654,685,707,735,794 'mypassword':506,652,683,705,733,792 'mysql':10,47,134,158,166,184,633,646,677,699,727,750,1224,1294,1296,1408 'mysql-client':157,165 'mysql.createconnection':761 'mysql/mariadb':137,635 'mysql2':183 'mysql2/promise':752 'n':453,723,1057 'name':247,345,573,870,878 'necessari':1437 'need':89 'never':1187 'new':272,408,597,972,983,1060,1087 'node.js':168,258,389,584,747,942 'non':1448 'non-exist':1447 'npm':171,177,181 'null':298,630,807,1025 'o':377 'o.created':383 'o.order':369 'o.total':371 'o.user':380 'object.keys':429,1033 'object.values':437,1041 'offset':1357 'often':125 'open':1123,1376 'optim':1501 'option':144,957,964 'order':236,376,577,711 'orders.json':238 'outfil':713 'output':341,514,837,906,921,931,1018,1022,1053,1070,1246,1255,1309,1338,1464 'outputpath':405,455,457,464,961,1069,1076,1083,1108 'p':651,682,704,732 'pagin':1167,1355 'parameter':1155 'password':556,615,767,791,1183 'path':828,847,856,868,905,1391 'permiss':1191,1198,1398 'pg':179,589 'pgdatabas':499 'pghost':493 'pgpassword':505 'pgport':496 'pguser':502 'pipelin':66 'pool':587,596,598 'pool.end':610 'pool.query':604 'postgr':503 'postgresql':8,46,129,132,155,164,180,477,479,1223,1266,1406 'postgresql-cli':154 'practic':1119 'pre':127 'pre-instal':126 'prepar':990 'pretti':212 'prevent':1140,1158 'privileg':1438 'product':816 'production-readi':815 'prompt':1200 'proper':675,1196,1476 'psql':511,515,535,554,569,1268,1462 'q':881 'queri':3,6,37,39,42,78,186,190,200,239,269,280,300,304,314,355,404,416,476,478,507,532,550,565,594,605,632,634,641,666,724,757,778,830,897,914,936,960,993,997,1101,1130,1150,1156,1178,1205,1214,1242,1301,1324,1353,1445,1486,1491,1502 'querymysql':755,795 'querypostgresql':592,618 'querysqlitetocsv':402,468 'querysqlitetojson':267,288 'quot':1343,1482,1485 'rate':1116 'read':1330,1397 'readi':817 'readon':275,411,986,1121,1126,1326 'refer':1446 'refus':1401 'reject':1428 'relat':43 'report':23,61,96 'requir':116,142,262,393,399,588,672,751,946,952 'result':14,50,83,424,483,602,639,1113,1115,1365 'result.rows':607 'return':283,422,459,465,606,779,1004,1012,1071 'root':650,681,703,731,790 'row':278,284,414,430,436,438,462,521,626,629,775,780,803,806,917,926,929,999,1011,1024,1034,1040,1042,1081,1288 'rowcount':1007,1074 'rows.length':420,461,1002,1075,1080 'rows.map':435,1039 'run':1418,1494 'sanit':1337 'second':1137 'secur':1179 'see':1507 'select':205,218,234,245,290,324,343,367,470,520,526,538,560,571,620,656,687,709,741,797,831,869,1102 'server':1409 'servic':1416 'set':485,1131,1310,1366 'silent':663,693,1304 'skill':185 'skill-database-query-and-export' 'solut':1388,1410,1430,1451,1475,1497 'source-besoeasy' 'specif':1235 'sql':1159 'sqlite':7,45,119,176,187,191,301,305,810,818,872,1222,1229,1231,1238,1380,1528 'sqlite3':153,163,175,203,216,232,243,265,317,334,360,396,866,903,949,1230,1240,1456 'stdout':545,1278 'stmt':995 'stmt.all':1000 'store':1181 'string':443,487,553,1047,1233,1271,1344 'success':924,1005,1072 'sudo':147 'symptom':1379,1402,1426,1444,1468,1490 'tabl':228,357,568,696,863,876,886,1170,1361,1440,1450,1454,1458 'take':1487 'termin':716,721 'text':1201 'throw':971,1059,1086 'time':1523 'timeout':726,738,988,1133,1138,1312,1316,1506 'tool':117 'topic-agent-skills' 'topic-ai-agents' 'topic-claude-code' 'topic-clawdbot' 'topic-clawdbot-skill' 'topic-llm-tools' 'topic-mcp-server' 'topic-openai' 'topic-openclaw' 'topic-vibe-coding' 'topic-vibecoding' 'total':744 'track':1518 'transform':1511 'tri':600,773,981 'troubleshoot':1372 'true':276,412,543,987,1006,1073 'type':875,1221 'typeof':441,1045 'u':374,649,680,702,730 'u.id':379 'u.name':368 'ubuntu/debian':146 'unabl':1374 'unsupport':1062 'usag':285,467,611,784,1097,1529 'use':17,69,70,84,97,106,214,489,510,1120,1134,1154,1164,1239,1247,1267,1275,1287,1295,1302,1325,1354,1481 'user':75,207,220,250,287,292,297,326,350,373,472,528,540,555,562,576,614,622,658,689,746,765,789,799,833,879,882,887,1104,1152,1211,1234,1363,1435 'username/password':1429 'users.csv':342,549,665,839 'val':440,442,445,446,1044,1046,1051 'val.includes':444,1048 'val.replace':1049 'valid':821,965,1142,1320 'valu':1478 'variabl':1186,1274 'verifi':1411,1431 'warn':1362 'wc':919 'workflow':32,105 'write':1065,1197 'y':152","prices":[{"id":"8318050f-8bab-4b69-8bd6-afed22d28545","listingId":"60087a2d-4e3d-4cb8-8c19-3ba87a3069d4","amountUsd":"0","unit":"free","nativeCurrency":null,"nativeAmount":null,"chain":null,"payTo":null,"paymentMethod":"skill-free","isPrimary":true,"details":{"org":"besoeasy","category":"open-skills","install_from":"skills.sh"},"createdAt":"2026-04-18T22:10:40.363Z"}],"sources":[{"listingId":"60087a2d-4e3d-4cb8-8c19-3ba87a3069d4","source":"github","sourceId":"besoeasy/open-skills/database-query-and-export","sourceUrl":"https://github.com/besoeasy/open-skills/tree/main/skills/database-query-and-export","isPrimary":false,"firstSeenAt":"2026-04-18T22:10:40.363Z","lastSeenAt":"2026-05-02T12:55:03.314Z"}],"details":{"listingId":"60087a2d-4e3d-4cb8-8c19-3ba87a3069d4","quickStartSnippet":null,"exampleRequest":null,"exampleResponse":null,"schema":null,"openapiUrl":null,"agentsTxtUrl":null,"citations":[],"useCases":[],"bestFor":[],"notFor":[],"kindDetails":{"org":"besoeasy","slug":"database-query-and-export","github":{"repo":"besoeasy/open-skills","stars":111,"topics":["agent-skills","ai","ai-agents","claude-code","clawdbot","clawdbot-skill","llm-tools","mcp-server","openai","openclaw","vibe-coding","vibecoding"],"license":null,"html_url":"https://github.com/besoeasy/open-skills","pushed_at":"2026-03-31T13:05:30Z","description":"Battle-tested skill library for AI agents. Save 98% of API costs with ready-to-use code for crypto, PDFs, search, web scraping & more. No trial-and-error, no expensive APIs.","skill_md_sha":"203497740e49bca41044b31a5ecd904406024caf","skill_md_path":"skills/database-query-and-export/SKILL.md","default_branch":"main","skill_tree_url":"https://github.com/besoeasy/open-skills/tree/main/skills/database-query-and-export"},"layout":"multi","source":"github","category":"open-skills","frontmatter":{"name":"database-query-and-export","description":"Query SQLite, PostgreSQL, and MySQL databases and export results to CSV/JSON. Use when: (1) Extracting data for reports, (2) Database backup and migration, (3) Data analysis workflows, or (4) Automated database queries."},"skills_sh_url":"https://skills.sh/besoeasy/open-skills/database-query-and-export"},"updatedAt":"2026-05-02T12:55:03.314Z"}}