> For the complete documentation index, see [llms.txt](https://docs.flexbase.in/llms.txt). Markdown versions of documentation pages are available by appending `.md` to page URLs; this page is available as [Markdown](https://docs.flexbase.in/data-and-providers/data-stores/time-series-store/timescale-db.md).

# Timescale Db

## Description

TimescaleDB (PostgreSQL extension) can be used as the backing implementation for Flex time-series operations. Your application code should depend on `IFlexTimeSeriesStore`, while Flex provides the provider bridge and wiring.

## Important concepts

* **`IFlexTimeSeriesStore` is the contract**: app code writes and queries time-series data via a shared interface.
* **PostgreSQL connection + schema**: TimescaleDB is accessed through a Postgres connection string and optional schema.
* **Provider bridge**: the TimescaleDB implementation is exposed via an `IFlexTimeSeriesStoreBridge` internally, but most consumers only need `IFlexTimeSeriesStore`.

## Configuration in DI

Add the provider in your DI composition root (commonly in `EndPoints/...CommonConfigs/OtherApplicationServicesConfig.cs` or wherever you centralize registrations).

```csharp
// using Sumeru.Flex; // IFlexTimeSeriesStore

public static class OtherApplicationServicesConfig
{
	public static IServiceCollection AddOtherApplicationServices(
		this IServiceCollection services,
		IConfiguration configuration)
	{
		// Registers TimescaleDB as the IFlexTimeSeriesStore bridge.
		// Flex auto-wires generated Queries/Handlers that *use* IFlexTimeSeriesStore.
		services.AddFlexTimescaleDBTimeSeriesStore(configuration);

		return services;
	}
}
```

## appsettings.json

Configuration is read from `FlexBase:DataStores:TimeSeries:TimescaleDB`.

```json
{
  "FlexBase": {
	"DataStores": {
	  "TimeSeries": {
		"TimescaleDB": {
		  "ConnectionString": "Host=...;Database=...;Username=...;Password=...",
		  "Schema": "public",
		  "TableName": "telemetry_points",
		  "TimeColumn": "time"
		}
	  }
	}
  }
}
```

## Examples (template-based)

These examples mirror the generated Query and PostBusHandler templates. You do **not** register these types manually—Flex discovers and wires generated Queries/Handlers automatically.

### Get the latest point (Query)

```csharp
using Microsoft.Extensions.Logging;
using Sumeru.Flex;
using System.Threading.Tasks;

namespace {YourApplication}.Queries.TimeSeries;

public class SensorGetLatest : FlexiQueryBridgeAsync<SensorPointDto>
{
	protected readonly ILogger<SensorGetLatest> _logger;
	protected readonly IFlexHost _flexHost;
	protected readonly IFlexTimeSeriesStore _timeSeriesStore;
	protected SensorGetLatestParams _params;
	protected FlexAppContextBridge _flexAppContext;

	public SensorGetLatest(ILogger<SensorGetLatest> logger, IFlexHost flexHost, IFlexTimeSeriesStore timeSeriesStore)
	{
		_logger = logger;
		_flexHost = flexHost;
		_timeSeriesStore = timeSeriesStore;
	}

	public virtual SensorGetLatest AssignParameters(SensorGetLatestParams @params)
	{
		_params = @params;
		return this;
	}

	public virtual async Task<SensorPointDto?> Fetch()
	{
		_flexAppContext = _params.GetAppContext();
		var latest = await _timeSeriesStore.GetLatestAsync<SensorPoint>(_params.SeriesId);
		// TODO: map SensorPoint -> SensorPointDto
		return latest as SensorPointDto;
	}
}

public class SensorGetLatestParams : DtoBridge
{
	public string SeriesId { get; set; }
}
```

## TimescaleDB considerations

* Make sure the TimescaleDB extension is installed/enabled in your Postgres instance.
* Store `ConnectionString` securely (Key Vault / secret provider).
