2020-06-05 21:22:17 +02:00
|
|
|
# BotBase - Notes on database interaction
|
|
|
|
|
|
|
|
BotBase has an built-in API to interact with a SQLite3 database, located in the
|
|
|
|
`BotBase/database/query.py` module. The reason why SQLite3 was chosen among the
|
|
|
|
lots of options is that it's lightweight, has less security concerns (no user
|
|
|
|
and password to remember) and requires literally no setup at all.
|
|
|
|
|
|
|
|
The configuration is hassle-free, you can keep the default values and they'll
|
|
|
|
work just fine. If you need a more complex database structure, just edit
|
|
|
|
the `DB_CREATE` SQL query to fit your needs, but do not alter the default
|
|
|
|
`users` table unless you also change all the SQL queries in the `config.py`
|
|
|
|
file as this would otherwise break the whole internal machinery of BotBase.
|
|
|
|
|
|
|
|
## Available methods
|
|
|
|
|
|
|
|
The module `BotBase.database.query` implements the following default methods
|
|
|
|
to interact with the database. All methods either return the result of a query
|
|
|
|
or `True` if the operation was successful, or an exception if the query errored.
|
|
|
|
|
|
|
|
Please note that the methods are **NOT** locked and that proper locking is
|
|
|
|
needed if you think that your bot might get a `sqlite3.OoerationalError: database
|
|
|
|
is locked` error when accessing the database.
|
|
|
|
|
|
|
|
All queries are performed within a `with` block and therefore rollbacked
|
|
|
|
automatically if an error occurs or committed if the transaction was successful.
|
|
|
|
|
2020-06-05 21:26:37 +02:00
|
|
|
- `get_user()` -> Given a Telegram ID as input, returns a tuple containing
|
|
|
|
the unique id of the user in the database, its telegram id, username,
|
|
|
|
the date and time the user was inserted in the database as a string
|
|
|
|
(formatted as d/m/Y H:M:S) and an integer (0 for `False` and 1 for `True`)
|
|
|
|
that represents the user's status (whether it is banned or not)
|
2020-06-05 21:22:17 +02:00
|
|
|
|
2020-06-06 14:37:14 +02:00
|
|
|
- `get_users()` -> This method takes no parameter and returns a list
|
|
|
|
of tuples. Each tuple contains a user ID as stored in the database
|
2020-06-05 21:22:17 +02:00
|
|
|
|
2020-06-05 21:26:37 +02:00
|
|
|
- `set_user()` -> Saves an ID/username pair (in this order)
|
|
|
|
to the database. The username parameter can be `None`
|
2020-06-05 21:22:17 +02:00
|
|
|
|
2020-06-06 19:28:12 +02:00
|
|
|
- `ban_user()` -> Bans the user with the given user ID
|
2020-06-05 21:22:17 +02:00
|
|
|
|
2020-06-06 19:28:12 +02:00
|
|
|
- `unban_user()` -> Unbans a user with the given ID
|
|
|
|
|
|
|
|
- `update_user` -> Updates a user's username with the given ID
|
2020-06-05 21:22:17 +02:00
|
|
|
|
|
|
|
# I need MySQL/other DBMS!
|
|
|
|
|
|
|
|
The API has been designed in a way that makes it easy to swap between different
|
|
|
|
database managers, so if you feel in the right mood make a PR to support a new
|
|
|
|
database and it'll be reviewed ASAP.
|
|
|
|
|
2020-06-06 14:37:14 +02:00
|
|
|
|
|
|
|
# Adding more methods
|
|
|
|
|
|
|
|
If you want to add custom methods to the API, we advise to follow the bot's convention:
|
|
|
|
|
|
|
|
- Set the SQL query as a global variable whose name starts with `DB_` in `config.py`
|
|
|
|
- Import it in the `BotBase.database.query` module
|
|
|
|
- Create a new function that takes the required parameters whose name reflects the query name (without `DB_`)
|
|
|
|
- Perform the query in a `with` context manager, close the cursor when you're done
|
|
|
|
- Return `True` or the query result if the query was successful, or an `Exception` subclass if an error occurs
|