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
- 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 '¶