Loading...
Loading...
Serverpod ORM with PostgreSQL or SQLite — CRUD, filters, sorting, pagination, includes, transactions, raw SQL, client-side database. Use when reading or writing data at runtime. To declare tables and relations instead, use serverpod-models.
npx skill4agent add serverpod/serverpod serverpod-databasetable.spy.yamlconfig/<runMode>.yamldatabase.filePath: <path>class: Company
table: company
fields:
name: String
foundedDate: DateTimevar company = Company(name: 'Serverpod Inc.', foundedDate: DateTime.now());
company = await Company.db.insertRow(session, company);
var stored = await Company.db.findById(session, company.id);
company = company.copyWith(name: 'New Name');
await Company.db.updateRow(session, company);
await Company.db.deleteRow(session, company);wheretvar activeCompanies = await Company.db.find(session,
where: (t) => t.name.ilike('a%') & (t.foundedDate > DateTime(2020)));t.column.equals(value)t.column.notEquals(value)>>=<<=t.column.between(a, b)notBetweent.column.inSet(set)notInSett.column.like('A%')ilike%_&|~t.address.street.like('%road%')t.orders.count() > 3t.orders.count((o) => o.itemType.equals('book')) > 3t.orders.none()t.orders.any()t.orders.any((o) => ...)t.orders.every((o) => ...)distanceCosinedistanceL2orderBy: (t) => t.columnorderBy: (t) => t.column.desc()orderByList: (t) => [t.name.desc(), t.id.asc()]orderBy: (t) => t.ceo.nameorderBy: (t) => t.employees.count()limitoffsetwhere: (t) => t.id > lastIdorderBy: (t) => t.idlimitincludevar employee = await Employee.db.findById(session, id,
include: Employee.include(address: Address.include()));
var company = await Company.db.findById(session, id,
include: Company.include(
employees: Employee.includeList(
where: (t) => t.name.ilike('a%'),
orderBy: (t) => t.name,
limit: 10,
includes: Employee.include(address: Address.include()),
),
));await Company.db.attachRow.employees(session, company, employee);
await Company.db.attach.employees(session, company, [e1, e2]);
await Company.db.detachRow.employees(session, employee);idawait session.db.transaction((tx) async {
await Company.db.insertRow(session, company, transaction: tx);
await OtherModel.db.updateRow(session, other, transaction: tx);
});txlockModetransactionfindfindFirstRowfindByIdLockMode.forUpdateforNoKeyUpdateforShareforKeyShareLockBehavior.waitnoWaitskipLockedCompany.db.lockRows(session, where: ..., lockMode: ..., transaction: tx)runtimeParametersBuilder: (params) => [params.searchPaths(['my_schema', 'public'])]await tx.setRuntimeParameters(...)MapRuntimeParameterslate DatabaseResult result;
result = await session.db.unsafeQuery(query, parameters: parameters);
result = await session.db.unsafeSimpleQuery(query);
late int rowsAffected;
rowsAffected = await session.db.unsafeExecute(query, parameters: parameters);
rowsAffected = await session.db.unsafeSimpleExecute(query);database: clientdatabase: allClientcreateSessionClientDatabaseSessionimport 'package:flutter/foundation.dart';
import 'package:path/path.dart' as p;
import 'package:path_provider/path_provider.dart';
import 'package:my_project_client/my_project_client.dart';
void main() async {
WidgetsFlutterBinding.ensureInitialized();
// Set the client URL to the server URL
final client = Client(clientUrl);
// Resolve the database path
final path = await resolveDatabasePath('app.db');
// Store the session in your state manager to later use on database operations.
final session = await client.createSession(path, isDebugMode: kDebugMode);
}
Future<String> resolveDatabasePath(String fileName) async {
if (kIsWeb) return fileName;
final dir = await getApplicationSupportDirectory();
return p.join(dir.path, fileName);
}serverpod_database