Skip to content
Back to top
View this page

# pyrate_limiter.buckets.postgres module

A bucket using PostgreSQL as backend

class pyrate_limiter.buckets.postgres.PostgresBucket(pool, table, rates)

  Bases: `AbstractBucket`

  count()

    Count number of items in the bucket

    Return type:

      `Union`[`int`, `Awaitable`[`int`]]

  flush()

    Flush the whole bucket - Must remove failing-rate after flushing

    Return type:

      `Optional`[`Awaitable`[`None`]]

  leak(current_timestamp=None)

    leaking bucket - removing items that are outdated

    Return type:

      `Union`[`int`, `Awaitable`[`int`]]

  peek(index)

    Peek at the rate-item at a specific index in latest-to-earliest order NOTE: The reason we cannot peek from the start of the queue(earliest-to-latest) is we can’t really tell how many outdated items are still in the queue

    Return type:

      `Union`[`RateItem`, `None`, `Awaitable`[`Optional`[`RateItem`]]]

  pool
  put(item)

    Put an item (typically the current time) in the bucket return true if successful, otherwise false

    Return type:

      `Union`[`bool`, `Awaitable`[`bool`]]

  table

class pyrate_limiter.buckets.postgres.Queries

  Bases: `object`

  COUNT = '\n SELECT COUNT(*) FROM {table}\n '
  CREATE_BUCKET_TABLE = '\n CREATE TABLE IF NOT EXISTS {table} (\n name VARCHAR,\n weight SMALLINT,\n item_timestamp TIMESTAMP\n )\n '
  CREATE_INDEX_ON_TIMESTAMP = '\n CREATE INDEX IF NOT EXISTS {index} ON {table} (item_timestamp)\n '
  FLUSH = '\n DELETE FROM {table}\n '
  LEAK = '\n DELETE FROM {table} WHERE item_timestamp < TO_TIMESTAMP({timestamp})\n '
  LEAK_COUNT = '\n SELECT COUNT(*) FROM {table} WHERE item_timestamp < TO_TIMESTAMP({timestamp})\n '
  PEEK = '\n SELECT name, weight, (extract(EPOCH FROM item_timestamp) * 1000) as item_timestamp\n FROM {table}\n ORDER BY item_timestamp DESC\n LIMIT 1\n OFFSET {offset}\n '
  PUT = '\n INSERT INTO {table} (name, weight, item_timestamp) VALUES (%s, %s, TO_TIMESTAMP(%s))\n '