Related Documentation:
- Generic Types - Type-safe database queries
- Cache Operations - Database result caching patterns
Configure PostgreSQL/MySQL in .env:
DB_TYPE=postgresql # or mysql
DB_HOST=localhost
DB_DATABASE=dify_plugin
DB_USERNAME=postgres
DB_PASSWORD=passwordGORM with custom query builder (internal/db/):
db.Create(&model)
db.Update(&model)
db.Delete(&model)
db.DeleteByCondition(condition)// Get single record
plugin, _ := db.GetOne[models.Plugin](
db.Equal("id", pluginID),
db.Equal("tenant_id", tenantID),
)
// Get multiple records
plugins, _ := db.GetAll[models.Plugin](
db.Equal("tenant_id", tenantID),
db.Page(1, 20),
db.OrderBy("created_at", true),
)
// Count records
count, _ := db.GetCount[models.Plugin](
db.Equal("tenant_id", tenantID),
)db.WithTransaction(func(tx *gorm.DB) error {
if err := db.Create(&plugin, tx); err != nil {
return err
}
return db.Update(&installation, tx)
})Equal,NotEqual: Basic comparisonsGreaterThan,LessThan: Numeric comparisonsLike: Pattern matchingPage(page, pageSize): PaginationOrderBy(field, desc): SortingPreload(relation): Eager loadingWithTransaction: Transaction wrapperWLock: Write lock for updates
All database models in internal/types/models/:
Plugin,PluginInstallation,PluginDeclarationToolInstallation,AIModelInstallation,AgentStrategyInstallationEndpoint,ServerlessRuntime,TenantStorage
// Get plugin with remote declaration
plugin, _ := db.GetOne[models.Plugin](
db.Equal("plugin_id", pluginID),
)
declaration := plugin.RemoteDeclaration
// Get stored declaration
decl, _ := db.GetOne[models.PluginDeclaration](
db.Equal("plugin_id", pluginID),
)