misc/how_to_make_sql_queries.ipynb (256 lines of code) (raw):

{ "cells": [ { "cell_type": "markdown", "metadata": {}, "source": [ "# How to make SQL queries with Claude\n", "\n", "\n", "In this notebook, we'll explore how to use Claude to generate SQL queries based on natural language questions. We'll set up a test database, provide the schema to Claude, and demonstrate how it can understand and translate human language into SQL queries." ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "## Setup\n", "\n", "First, let's install the necessary libraries and setup our Anthropic client with our API key." ] }, { "cell_type": "code", "execution_count": null, "metadata": {}, "outputs": [], "source": [ "# Install the necessary libraries\n", "%pip install anthropic" ] }, { "cell_type": "code", "execution_count": 2, "metadata": {}, "outputs": [], "source": [ "# Import the required libraries\n", "from anthropic import Anthropic\n", "import sqlite3\n", "\n", "# Set up the Anthropic API client\n", "client = Anthropic()\n", "MODEL_NAME = \"claude-3-opus-20240229\"" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "## Creating a Test Database\n", "\n", "We'll create a test database using SQLite and populate it with sample data:" ] }, { "cell_type": "code", "execution_count": 3, "metadata": {}, "outputs": [], "source": [ "# Connect to the test database (or create it if it doesn't exist)\n", "conn = sqlite3.connect(\"test_db.db\")\n", "cursor = conn.cursor()\n", "\n", "# Create a sample table\n", "cursor.execute(\"\"\"\n", " CREATE TABLE IF NOT EXISTS employees (\n", " id INTEGER PRIMARY KEY,\n", " name TEXT,\n", " department TEXT,\n", " salary INTEGER\n", " )\n", "\"\"\")\n", "\n", "# Insert sample data\n", "sample_data = [\n", " (1, \"John Doe\", \"Sales\", 50000),\n", " (2, \"Jane Smith\", \"Engineering\", 75000),\n", " (3, \"Mike Johnson\", \"Sales\", 60000),\n", " (4, \"Emily Brown\", \"Engineering\", 80000),\n", " (5, \"David Lee\", \"Marketing\", 55000)\n", "]\n", "cursor.executemany(\"INSERT INTO employees VALUES (?, ?, ?, ?)\", sample_data)\n", "conn.commit()" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "## Generating SQL Queries with Claude\n", "\n", "Now, let's define a function to send a natural language question to Claude and get the generated SQL query:" ] }, { "cell_type": "code", "execution_count": 8, "metadata": {}, "outputs": [], "source": [ "# Define a function to send a query to Claude and get the response\n", "def ask_claude(query, schema):\n", " prompt = f\"\"\"Here is the schema for a database:\n", "\n", "{schema}\n", "\n", "Given this schema, can you output a SQL query to answer the following question? Only output the SQL query and nothing else.\n", "\n", "Question: {query}\n", "\"\"\"\n", "\n", " response = client.messages.create(\n", " model=MODEL_NAME,\n", " max_tokens=2048,\n", " messages=[{\n", " \"role\": 'user', \"content\": prompt\n", " }]\n", " )\n", " return response.content[0].text" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "We'll retrieve the database schema and format it as a string:" ] }, { "cell_type": "code", "execution_count": 5, "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "CREATE TABLE EMPLOYEES (\n", "id INTEGER\n", "name TEXT\n", "department TEXT\n", "salary INTEGER\n", ")\n" ] } ], "source": [ "# Get the database schema\n", "schema = cursor.execute(\"PRAGMA table_info(employees)\").fetchall()\n", "schema_str = \"CREATE TABLE EMPLOYEES (\\n\" + \"\\n\".join([f\"{col[1]} {col[2]}\" for col in schema]) + \"\\n)\"\n", "print(schema_str)" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "Now, let's provide an example natural language question and send it to Claude:" ] }, { "cell_type": "code", "execution_count": 9, "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "SELECT name, salary\n", "FROM EMPLOYEES\n", "WHERE department = 'Engineering';\n" ] } ], "source": [ "# Example natural language question\n", "question = \"What are the names and salaries of employees in the Engineering department?\"\n", "# Send the question to Claude and get the SQL query\n", "sql_query = ask_claude(question, schema_str)\n", "print(sql_query)" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "## Executing the Generated SQL Query\n", "\n", "Finally, we'll execute the generated SQL query on our test database and print the results:" ] }, { "cell_type": "code", "execution_count": 10, "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "('Jane Smith', 75000)\n", "('Emily Brown', 80000)\n" ] } ], "source": [ "# Execute the SQL query and print the results\n", "results = cursor.execute(sql_query).fetchall()\n", "\n", "for row in results:\n", " print(row)" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "Don't forget to close the database connection when you're done:" ] }, { "cell_type": "code", "execution_count": 11, "metadata": {}, "outputs": [], "source": [ "# Close the database connection\n", "conn.close()" ] } ], "metadata": { "kernelspec": { "display_name": "Python 3", "language": "python", "name": "python3" }, "language_info": { "codemirror_mode": { "name": "ipython", "version": 3 }, "file_extension": ".py", "mimetype": "text/x-python", "name": "python", "nbconvert_exporter": "python", "pygments_lexer": "ipython3", "version": "3.10.12" } }, "nbformat": 4, "nbformat_minor": 2 }