PrerequisiteYou should have the latest staging version of the MindsDB repository installed locally. Follow this guide to learn how to install MindsDB for development.
What are Database Handlers?
Database handlers act as a bridge to any database. You use database handlers to create databases using the CREATE DATABASE command. So you can reach data from any database that has its handler implemented within MindsDB.ML HandlersTo learn more about handlers and how to implement a machine learning (ML) handler, visit our doc page here.
Creating a Database Handler
You can create your own database handler within MindsDB by inheriting from theDatabaseHandler class.
By providing the implementation for some or all of the methods contained in the DatabaseHandler class, you can connect with the database of your choice.
Core Methods
Apart from the__init__() method, there are seven core methods that must be implemented. We recommend checking actual examples in the codebase to get an idea of what goes into each of these methods, as they can change a bit depending on the nature of the system being integrated.
Let’s review the purpose of each method.
| Method | Purpose |
|---|---|
connect() | It performs the necessary steps to connect to the underlying system. |
disconnect() | It gracefully closes connections established in the connect() method. |
check_connection() | It evaluates if the connection is alive and healthy. This method is called frequently. |
native_query() | It parses any native statement string and acts upon it (for example, raw SQL commands). |
query() | It takes a parsed SQL command in the form of an abstract syntax tree and executes it. |
get_tables() | It lists and returns all the available tables. Each handler decides what a table means for the underlying system when interacting with it from the data layer. Typically, these are actual tables. |
get_columns() | It returns columns of a table registered in the handler with the respective data type. |
Other Common MethodsUnder the
mindsdb.integrations.libs.utils library, contributors can find various methods that may be useful while implementing new handlers.Also, there are wrapper classes for the DatabaseHandler instances called HandlerResponse and HandlerStatusResponse. You should use them to ensure proper output formatting.Implementation
Each database handler should inherit from theDatabaseHandler class.
Here is a step-by-step guide:
-
Setting the
nameclass property: MindsDB uses it internally as the name of the handler. For example, theCREATE DATABASEstatement uses the handler’s name. -
Implementing the
__init__()method: This method initializes the handler. Theconnection_dataargument contains thePARAMETERSfrom theCREATE DATABASEstatement, such asuser,password, etc. -
Implementing the
connect()method: Theconnect()method sets up the connection. -
Implementing the
disconnect()method: Thedisconnect()method closes the existing connection. -
Implementing the
check_connection()method: Thecheck_connection()method performs the health check for the connection. -
Implementing the
native_query()method: Thenative_query()method runs commands of the native database language. -
Implementing the
query()method: The query method runs parsed SQL commands. -
Implementing the
get_tables()method: Theget_tables()method lists all the available tables. -
Implementing the
get_columns()method: Theget_columns()method lists all columns of a specified table.
The connection_args Dictionary
The connection_args dictionary contains all of the arguments used to establish the connection along with their descriptions, types, labels, and whether they are required or not.
Here is an example of the connection_args dictionary from the MySQL handler.
The connection_args_example Dictionary
The connection_args_example dictionary contains an example of all required arguments to establish the connection.
Here is an example of the connection_args_example dictionary from the MySQL handler.
Exporting All Required Variables
The following should be exported in the__init__.py file of the handler:
- The
Handlerclass. - The
versionof the handler. - The
nameof the handler. - The
typeof the handler, eitherDATAhandler orMLhandler. - The
icon_pathto the file with the database icon. - The
titleof the handler or a short description. - The
descriptionof the handler. - The
connection_argsdictionary with the connection arguments. - The
connection_args_exampledictionary with an example of the connection arguments. - The
import_errormessage that is used if the import of theHandlerclass fails.
__about__.py. This file is imported into the __init__.py file.
Here is an example of the __init__.py file for the MySQL handler.
__about__.py file for the same MySQL handler contains the following variables: