# MySQL for Team (/database/providers/mysql/usage/mysql-for-team)



`MySQLDb` stores a Team's sessions and run history in MySQL.

## Usage [#usage]

Start in a [virtual environment](/sdk/setup).

Install the `agno`, `sqlalchemy`, `pymysql`, `openai`, and `ddgs` packages:

```shell
uv pip install agno sqlalchemy "pymysql[rsa]" openai ddgs
```

### Run MySQL [#run-mysql]

Install [Docker Desktop](https://docs.docker.com/get-started/get-docker/), then start MySQL on port `3306`:

```bash
docker run -d \
  --name mysql \
  -e MYSQL_ROOT_PASSWORD=ai \
  -e MYSQL_DATABASE=ai \
  -e MYSQL_USER=ai \
  -e MYSQL_PASSWORD=ai \
  -p 3306:3306 \
  mysql:8
```

Set your OpenAI API key:

## Set OpenAI Key [#set-openai-key]

Set your `OPENAI_API_KEY` as an environment variable. You can get one [from OpenAI](https://platform.openai.com/account/api-keys).

<CodeBlockTabs defaultValue="Mac">
  <CodeBlockTabsList>
    <CodeBlockTabsTrigger value="Mac">
      Mac
    </CodeBlockTabsTrigger>

    <CodeBlockTabsTrigger value="Windows PowerShell">
      Windows PowerShell
    </CodeBlockTabsTrigger>
  </CodeBlockTabsList>

  <CodeBlockTab value="Mac">
    ```bash
    export OPENAI_API_KEY=sk-***
    ```
  </CodeBlockTab>

  <CodeBlockTab value="Windows PowerShell">
    ```powershell
    $env:OPENAI_API_KEY = "your-openai-api-key"
    ```
  </CodeBlockTab>
</CodeBlockTabs>

```python title="mysql_for_team.py"
from typing import List

from agno.agent import Agent
from agno.db.mysql import MySQLDb
from agno.models.openai import OpenAIResponses
from agno.team import Team
from agno.tools.hackernews import HackerNewsTools
from agno.tools.websearch import WebSearchTools
from pydantic import BaseModel

db_url = "mysql+pymysql://ai:ai@localhost:3306/ai"
db = MySQLDb(db_url=db_url)


class Article(BaseModel):
    title: str
    summary: str
    reference_links: List[str]


hn_researcher = Agent(
    name="HackerNews Researcher",
    model=OpenAIResponses(id="gpt-5.2"),
    role="Gets top stories from HackerNews.",
    tools=[HackerNewsTools()],
)

web_searcher = Agent(
    name="Web Searcher",
    model=OpenAIResponses(id="gpt-5.2"),
    role="Searches the web for information on a topic",
    tools=[WebSearchTools()],
    add_datetime_to_context=True,
)

hn_team = Team(
    name="HackerNews Team",
    model=OpenAIResponses(id="gpt-5.2"),
    members=[hn_researcher, web_searcher],
    db=db,
    instructions=[
        "First, search HackerNews for what the user is asking about.",
        "Then, ask the web searcher to search for each story to get more information.",
        "Finally, summarize each story and include its reference links.",
    ],
    output_schema=Article,
    markdown=True,
    show_members_responses=True,
    add_member_tools_to_context=False,
)

hn_team.print_response("Write an article about the top 2 stories on HackerNews")
```

## Run the example [#run-the-example]

Save the code as `mysql_for_team.py`, start the database described above, and run:

```shell
python mysql_for_team.py
```

## Parameters [#parameters]

| Parameter         | Type               | Default | Description                                                                                                                              |
| ----------------- | ------------------ | ------- | ---------------------------------------------------------------------------------------------------------------------------------------- |
| `id`              | `Optional[str]`    | `None`  | Database ID. Derived from the connection and schema when omitted.                                                                        |
| `db_engine`       | `Optional[Engine]` | `None`  | SQLAlchemy database engine. Provide this or `db_url`.                                                                                    |
| `db_schema`       | `Optional[str]`    | `None`  | Database schema. Uses `"ai"` when omitted.                                                                                               |
| `db_url`          | `Optional[str]`    | `None`  | Database URL. Provide this or `db_engine`.                                                                                               |
| `session_table`   | `Optional[str]`    | `None`  | Table for Agent, Team, and Workflow sessions. Uses `"agno_sessions"` when omitted.                                                       |
| `runs_table`      | `Optional[str]`    | `None`  | Table for session runs. Uses `"agno_runs"` with the default session table, or `<session_table>_runs` when `session_table` is customized. |
| `memory_table`    | `Optional[str]`    | `None`  | Table for memories. Uses `"agno_memories"` when omitted.                                                                                 |
| `metrics_table`   | `Optional[str]`    | `None`  | Table for metrics. Uses `"agno_metrics"` when omitted.                                                                                   |
| `eval_table`      | `Optional[str]`    | `None`  | Table for evaluation run data. Uses `"agno_eval_runs"` when omitted.                                                                     |
| `knowledge_table` | `Optional[str]`    | `None`  | Table for knowledge content. Uses `"agno_knowledge"` when omitted.                                                                       |
| `traces_table`    | `Optional[str]`    | `None`  | Table for traces. Uses `"agno_traces"` when omitted.                                                                                     |
| `spans_table`     | `Optional[str]`    | `None`  | Table for spans. Uses `"agno_spans"` when omitted.                                                                                       |
| `versions_table`  | `Optional[str]`    | `None`  | Table for schema versions. Uses `"agno_schema_versions"` when omitted.                                                                   |
| `create_schema`   | `bool`             | `True`  | Create the database schema when it does not exist. Set to `False` when migrations manage it.                                             |
