Database Integration
Overview
The NextAI starter kit uses PostgreSQL with Prisma ORM for database management. This combination provides a robust, type-safe, and scalable solution for storing and retrieving data in your AI application.
Features
- Type-safe database queries with Prisma
- Automatic schema migrations
- Efficient data retrieval and storage
- Support for complex relationships
- Built-in connection pooling
Setup
Environment Variables
To set up the database connection, configure the following environment variables in your .env
file:
POSTGRES_URL="postgresql://username:password@hostname:port/database"
POSTGRES_DIRECT_URL="postgresql://username:password@hostname:port/database"
You can obtain these connection strings from your PostgreSQL provider (e.g., Supabase, Neon, or a self-hosted instance).
Database Schema
The starter kit includes a predefined schema in prisma/schema.prisma
that supports all the core features:
- User data
- Chat sessions
- Messages
- Artifacts (documents, images, etc.)
- Votes and feedback
Database Operations
Queries
The starter kit provides a set of predefined database queries in lib/db/queries.ts
for common operations:
- Retrieving chat history
- Saving messages
- Managing user data
- Handling artifacts
Example of retrieving chat messages:
const messagesFromDb = await getMessagesByChatId({
id,
});
Migrations
The starter kit includes scripts for managing database migrations:
# Generate migrations based on schema changes
pnpm db:generate
# Apply migrations to the database
pnpm db:migrate
# View database in Prisma Studio
pnpm db:studio
Customization
Adding New Models
To add new database models:
- Update the
prisma/schema.prisma
file with your new model definition - Generate migrations using
pnpm db:generate
- Apply the migrations using
pnpm db:migrate
- Create query functions in
lib/db/queries.ts
for interacting with your new model
Example of adding a new model:
model CustomData {
id String @id @default(cuid())
userId String
name String
value String
createdAt DateTime @default(now())
updatedAt DateTime @updatedAt
}
Optimizing Queries
For performance optimization:
- Use selective field retrieval to minimize data transfer
- Implement pagination for large result sets
- Create indexes for frequently queried fields
- Use transactions for operations that require atomicity
Best Practices
- Always use parameterized queries to prevent SQL injection
- Implement proper error handling for database operations
- Use transactions for operations that modify multiple records
- Regularly back up your database
- Monitor database performance and optimize as needed
Security Considerations
- Store database credentials securely in environment variables
- Implement proper access control for database operations
- Sanitize user input before using it in database queries
- Use the principle of least privilege for database users
For more detailed information about database operations and advanced usage, refer to the Prisma documentation (opens in a new tab).