Skip to main content

TDengine connectors

TDengine provides many connectors for development, including C/C++, JAVA, Python, RESTful, Go, Node.JS, etc.

NOTE: All APIs which require a SQL string as parameter, including but not limit to taos_query, taos_query_a, taos_subscribe in the C/C++ Connector and their counterparts in other connectors, can ONLY process one SQL statement at a time. If more than one SQL statements are provided, their behaviors are undefined.

C/C++ API

C/C++ APIs are similar to the MySQL APIs. Applications should include TDengine head file taos.h to use C/C++ APIs by adding the following line in code:

#include <taos.h>

Make sure TDengine library libtaos.so is installed and use -ltaos option to link the library when compiling. In most cases, if the return value of an API is integer, it return 0 for success and other values as an error code for failure; if the return value is pointer, then NULL is used for failure.

C/C++ sync API

Sync APIs are those APIs waiting for responses from the server after sending a request. TDengine has the following sync APIs:

  • TAOS *taos_connect(char *ip, char *user, char *pass, char *db, int port)

    Open a connection to a TDengine server. The parameters are ip (IP address of the server), user (username to login), pass (password to login), db (database to use after connection) and port (port number to connect). The parameter db can be NULL for no database to use after connection. Otherwise, the database should exist before connection or a connection error is reported. The handle returned by this API should be kept for future use.

  • void taos_close(TAOS *taos)

    Close a connection to a TDengine server by the handle returned by taos_connect`

  • int taos_query(TAOS *taos, char *sqlstr)

    The API used to run a SQL command. The command can be DQL or DML. The parameter taos is the handle returned by taos_connect. Return value -1 means failure.

  • TAOS_RES *taos_use_result(TAOS *taos)

    Use the result after running taos_query. The handle returned should be kept for future fetch.

  • TAOS_ROW taos_fetch_row(TAOS_RES *res)

    Fetch a row of return results through res, the handle returned by taos_use_result.

  • int taos_num_fields(TAOS_RES *res)

    Get the number of fields in the return result.

  • TAOS_FIELD *taos_fetch_fields(TAOS_RES *res)

    Fetch the description of each field. The description includes the property of data type, field name, and bytes. The API should be used with taos_num_fields to fetch a row of data.

  • void taos_free_result(TAOS_RES *res)

    Free the resources used by a result set. Make sure to call this API after fetching results or memory leak would happen.

  • void taos_init()

    Initialize the environment variable used by TDengine client. The API is not necessary since it is called int taos_connect by default.

  • char *taos_errstr(TAOS *taos)

    Return the reason of the last API call failure. The return value is a string.

  • int *taos_errno(TAOS *taos)

    Return the error code of the last API call failure. The return value is an integer.

  • int taos_options(TSDB_OPTION option, const void * arg, ...)

    Set client options. The parameter option supports values of TSDB_OPTION_CONFIGDIR (configuration directory), TSDB_OPTION_SHELL_ACTIVITY_TIMER, TSDB_OPTION_LOCALE (client locale) and TSDB_OPTION_TIMEZONE (client timezone).

The 12 APIs are the most important APIs frequently used. Users can check taos.h file for more API information.

Note: The connection to a TDengine server is not multi-thread safe. So a connection can only be used by one thread.

C/C++ parameter binding API

TDengine also provides parameter binding APIs, like MySQL, only question mark ? can be used to represent a parameter in these APIs.

  • TAOS_STMT* taos_stmt_init(TAOS *taos)

    Create a TAOS_STMT to represent the prepared statement for other APIs.

  • int taos_stmt_prepare(TAOS_STMT *stmt, const char *sql, unsigned long length)

    Parse SQL statement sql and bind result to stmt , if length larger than 0, its value is used to determine the length of sql, the API auto detects the actual length of sql otherwise.

  • int taos_stmt_bind_param(TAOS_STMT *stmt, TAOS_BIND *bind)

    Bind values to parameters. bind points to an array, the element count and sequence of the array must be identical as the parameters of the SQL statement. The usage of TAOS_BIND is same as MYSQL_BIND in MySQL, its definition is as below:

    typedef struct TAOS_BIND {
    int buffer_type;
    void * buffer;
    unsigned long buffer_length; // not used in TDengine
    unsigned long *length;
    int * is_null;
    int is_unsigned; // not used in TDengine
    int * error; // not used in TDengine
    } TAOS_BIND;
  • int taos_stmt_add_batch(TAOS_STMT *stmt)

    Add bound parameters to batch, client can call taos_stmt_bind_param again after calling this API. Note this API only support insert / import statements, it returns an error in other cases.

  • int taos_stmt_execute(TAOS_STMT *stmt)

    Execute the prepared statement. This API can only be called once for a statement at present.

  • TAOS_RES* taos_stmt_use_result(TAOS_STMT *stmt)

    Acquire the result set of an executed statement. The usage of the result is same as taos_use_result, taos_free_result must be called after one you are done with the result set to release resources.

  • int taos_stmt_close(TAOS_STMT *stmt)

    Close the statement, release all resources.

C/C++ async API

In addition to sync APIs, TDengine also provides async APIs, which are more efficient. Async APIs are returned right away without waiting for a response from the server, allowing the application to continute with other tasks without blocking. So async APIs are more efficient, especially useful when in a poor network.

All async APIs require callback functions. The callback functions have the format:

void fp(void *param, TAOS_RES * res, TYPE param3)

The first two parameters of the callback function are the same for all async APIs. The third parameter is different for different APIs. Generally, the first parameter is the handle provided to the API for action. The second parameter is a result handle.

  • void taos_query_a(TAOS *taos, char *sqlstr, void (*fp)(void *param, TAOS_RES *, int code), void *param);

    The async query interface. taos is the handle returned by taos_connect interface. sqlstr is the SQL command to run. fp is the callback function. param is the parameter required by the callback function. The third parameter of the callback function code is 0 (for success) or a negative number (for failure, call taos_errstr to get the error as a string). Applications mainly handle with the second parameter, the returned result set.

  • void taos_fetch_rows_a(TAOS_RES *res, void (*fp)(void *param, TAOS_RES *, int numOfRows), void *param);

    The async API to fetch a batch of rows, which should only be used with a taos_query_a call. The parameter res is the result handle returned by taos_query_a. fp is the callback function. param is a user-defined structure to pass to fp. The parameter numOfRows is the number of result rows in the current fetch cycle. In the callback function, applications should call taos_fetch_row to get records from the result handle. After getting a batch of results, applications should continue to call taos_fetch_rows_a API to handle the next batch, until the numOfRows is 0 (for no more data to fetch) or -1 (for failure).

  • void taos_fetch_row_a(TAOS_RES *res, void (*fp)(void *param, TAOS_RES *, TAOS_ROW row), void *param);

    The async API to fetch a result row. res is the result handle. fp is the callback function. param is a user-defined structure to pass to fp. The third parameter of the callback function is a single result row, which is different from that of taos_fetch_rows_a API. With this API, it is not necessary to call taos_fetch_row to retrieve each result row, which is handier than taos_fetch_rows_a but less efficient.

Applications may apply operations on multiple tables. However, it is important to make sure the operations on the same table are serialized. That means after sending an insert request in a table to the server, no operations on the table are allowed before a response is received.

C/C++ continuous query interface

TDengine provides APIs for continuous query driven by time, which run queries periodically in the background. There are only two APIs:

  • TAOS_STREAM *taos_open_stream(TAOS *taos, char *sqlstr, void (*fp)(void *param, TAOS_RES *, TAOS_ROW row), int64_t stime, void *param, void (*callback)(void *));

    The API is used to create a continuous query.

    • taos: the connection handle returned by taos_connect.
    • sqlstr: the SQL string to run. Only query commands are allowed.
    • fp: the callback function to run after a query
    • param: a parameter passed to fp
    • stime: the time of the stream starts in the form of epoch milliseconds. If 0 is given, the start time is set as the current time.
    • callback: a callback function to run when the continuous query stops automatically.

    The API is expected to return a handle for success. Otherwise, a NULL pointer is returned.

  • void taos_close_stream (TAOS_STREAM *tstr)

    Close the continuous query by the handle returned by taos_open_stream. Make sure to call this API when the continuous query is not needed anymore.

C/C++ subscription API

For the time being, TDengine supports subscription on one or multiple tables. It is implemented through periodic pulling from a TDengine server.

  • TAOS_SUB *taos_subscribe(TAOS* taos, int restart, const char* topic, const char *sql, TAOS_SUBSCRIBE_CALLBACK fp, void *param, int interval)

    The API is used to start a subscription session, it returns the subscription object on success and NULL in case of failure, the parameters are:

    • taos: The database connnection, which must be established already.
    • restart: Zero to continue a subscription if it already exits, other value to start from the beginning.
    • topic: The unique identifier of a subscription.
    • sql: A sql statement for data query, it can only be a select statement, can only query for raw data, and can only query data in ascending order of the timestamp field.
    • fp: A callback function to receive query result, only used in asynchronization mode and should be NULL in synchronization mode, please refer below for its prototype.
    • param: User provided additional parameter for the callback function.
    • interval: Pulling interval in millisecond. Under asynchronization mode, API will call the callback function fp in this interval, system performance will be impacted if this interval is too short. Under synchronization mode, if the duration between two call to taos_consume is less than this interval, the second call blocks until the duration exceed this interval.
  • typedef void (*TAOS_SUBSCRIBE_CALLBACK)(TAOS_SUB* tsub, TAOS_RES *res, void* param, int code)

    Prototype of the callback function, the parameters are:

    • tsub: The subscription object.
    • res: The query result.
    • param: User provided additional parameter when calling taos_subscribe.
    • code: Error code in case of failures.
  • TAOS_RES *taos_consume(TAOS_SUB *tsub)

    The API used to get the new data from a TDengine server. It should be put in an loop. The parameter tsub is the handle returned by taos_subscribe. This API should only be called in synchronization mode. If the duration between two call to taos_consume is less than pulling interval, the second call blocks until the duration exceed the interval. The API returns the new rows if new data arrives, or empty rowset otherwise, and if there's an error, it returns NULL.

  • void taos_unsubscribe(TAOS_SUB *tsub, int keepProgress)

    Stop a subscription session by the handle returned by taos_subscribe. If keepProgress is not zero, the subscription progress information is kept and can be reused in later call to taos_subscribe, the information is removed otherwise.

Java Connector

To Java delevopers, TDengine provides taos-jdbcdriver according to the JDBC(3.0) API. Users can find and download it through Sonatype Repository.

Since the native language of TDengine is C, the necessary TDengine library should be checked before using the taos-jdbcdriver:

  • libtaos.so (Linux) After TDengine is installed successfully, the library libtaos.so will be automatically copied to the /usr/lib/, which is the system's default search path.

  • taos.dll (Windows) After TDengine client is installed, the library taos.dll will be automatically copied to the C:/Windows/System32, which is the system's default search path.

Note: Please make sure that TDengine Windows client has been installed if developing on Windows. Now although TDengine client would be defaultly installed together with TDengine server, it can also be installed alone.

Since TDengine is time-series database, there are still some differences compared with traditional databases in using TDengine JDBC driver:

  • TDengine doesn't allow to delete/modify a single record, and thus JDBC driver also has no such method.
  • No support for transaction
  • No support for union between tables
  • No support for nested query,There is at most one open ResultSet for each Connection. Thus, TSDB JDBC Driver will close current ResultSet if it is not closed and a new query begins.

Version list of TAOS-JDBCDriver and required TDengine and JDK

taos-jdbcdriverTDengineJDK
1.0.31.6.1.x or higher1.8.x
1.0.21.6.1.x or higher1.8.x
1.0.11.6.1.x or higher1.8.x

DataType in TDengine and Java

The datatypes in TDengine include timestamp, number, string and boolean, which are converted as follows in Java:

TDengineJava
TIMESTAMPjava.sql.Timestamp
INTjava.lang.Integer
BIGINTjava.lang.Long
FLOATjava.lang.Float
DOUBLEjava.lang.Double
SMALLINT, TINYINTjava.lang.Short
BOOLjava.lang.Boolean
BINARY, NCHARjava.lang.String

How to get TAOS-JDBC Driver

maven repository

taos-jdbcdriver has been published to Sonatype Repository:

Using the following pom.xml for maven projects

<dependencies>
<dependency>
<groupId>com.taosdata.jdbc</groupId>
<artifactId>taos-jdbcdriver</artifactId>
<version>1.0.3</version>
</dependency>
</dependencies>

JAR file from the source code

After downloading the TDengine source code, execute mvn clean package in the directory src/connector/jdbc and then the corresponding jar file is generated.

Usage

get the connection

Class.forName("com.taosdata.jdbc.TSDBDriver");
String jdbcUrl = "jdbc:TAOS://127.0.0.1:6030/log?user=root&password=taosdata";
Connection conn = DriverManager.getConnection(jdbcUrl);

6030 is the default port and log is the default database for system monitor.

A normal JDBC URL looks as follows: jdbc:TAOS://{host_ip}:{port}/[database_name]?[user={user}|&password={password}|&charset={charset}|&cfgdir={config_dir}|&locale={locale}|&timezone={timezone}]

values in {} are necessary while values in [] are optional。Each option in the above URL denotes:

  • user:user name for login, defaultly root。
  • password:password for login,defaultly taosdata。
  • charset:charset for client,defaultly system charset
  • cfgdir:log directory for client, defaultly /etc/taos/ on Linux and C:/TDengine/cfg on Windows。
  • locale:language for client,defaultly system locale。
  • timezone:timezone for client,defaultly system timezone。

The options above can be configures (ordered by priority):

  1. JDBC URL

    As explained above.

  2. java.sql.DriverManager.getConnection(String jdbcUrl, Properties connProps)

public Connection getConn() throws Exception{
Class.forName("com.taosdata.jdbc.TSDBDriver");
String jdbcUrl = "jdbc:TAOS://127.0.0.1:0/log?user=root&password=taosdata";
Properties connProps = new Properties();
connProps.setProperty(TSDBDriver.PROPERTY_KEY_USER, "root");
connProps.setProperty(TSDBDriver.PROPERTY_KEY_PASSWORD, "taosdata");
connProps.setProperty(TSDBDriver.PROPERTY_KEY_CONFIG_DIR, "/etc/taos");
connProps.setProperty(TSDBDriver.PROPERTY_KEY_CHARSET, "UTF-8");
connProps.setProperty(TSDBDriver.PROPERTY_KEY_LOCALE, "en_US.UTF-8");
connProps.setProperty(TSDBDriver.PROPERTY_KEY_TIME_ZONE, "UTC-8");
Connection conn = DriverManager.getConnection(jdbcUrl, connProps);
return conn;
}
  1. Configuration file (taos.cfg)

    Default configuration file is /var/lib/taos/taos.cfg On Linux and C:\TDengine\cfg\taos.cfg on Windows

# client default username
# defaultUser root

# client default password
# defaultPass taosdata

# default system charset
# charset UTF-8

# system locale
# locale en_US.UTF-8

More options can refer to client configuration.

Create databases and tables

Statement stmt = conn.createStatement();

// create database
stmt.executeUpdate("create database if not exists db");

// use database
stmt.executeUpdate("use db");

// create table
stmt.executeUpdate("create table if not exists tb (ts timestamp, temperature int, humidity float)");

Note: if no step like use db, the name of database must be added as prefix like db.tb when operating on tables

Insert data

// insert data
int affectedRows = stmt.executeUpdate("insert into tb values(now, 23, 10.3) (now + 1s, 20, 9.3)");

System.out.println("insert " + affectedRows + " rows.");

now is the server time. now+1s is 1 second later than current server time. The time unit includes: a(millisecond), s(second), m(minute), h(hour), d(day), w(week), n(month), y(year).

Query database

// query data
ResultSet resultSet = stmt.executeQuery("select * from tb");

Timestamp ts = null;
int temperature = 0;
float humidity = 0;
while(resultSet.next()){

ts = resultSet.getTimestamp(1);
temperature = resultSet.getInt(2);
humidity = resultSet.getFloat("humidity");

System.out.printf("%s, %d, %s\n", ts, temperature, humidity);
}

query is consistent with relational database. The subscript start with 1 when retrieving return results. It is recommended to use the column name to retrieve results.

Close all

resultSet.close();
stmt.close();
conn.close();

please make sure the connection is closed to avoid the error like connection leakage

Using connection pool

HikariCP

  • dependence in pom.xml:
<dependency>
<groupId>com.zaxxer</groupId>
<artifactId>HikariCP</artifactId>
<version>3.4.1</version>
</dependency>
  • Examples:
 public static void main(String[] args) throws SQLException {
HikariConfig config = new HikariConfig();
config.setJdbcUrl("jdbc:TAOS://127.0.0.1:6030/log");
config.setUsername("root");
config.setPassword("taosdata");

config.setMinimumIdle(3); //minimum number of idle connection
config.setMaximumPoolSize(10); //maximum number of connection in the pool
config.setConnectionTimeout(10000); //maximum wait milliseconds for get connection from pool
config.setIdleTimeout(60000); // max idle time for recycle idle connection
config.setConnectionTestQuery("describe log.dn"); //validation query
config.setValidationTimeout(3000); //validation query timeout

HikariDataSource ds = new HikariDataSource(config); //create datasource

Connection connection = ds.getConnection(); // get connection
Statement statement = connection.createStatement(); // get statement

//query or insert
// ...

connection.close(); // put back to conneciton pool
}

The close() method will not close the connection from HikariDataSource.getConnection(). Instead, the connection is put back to the connection pool. More instructions can refer to User Guide

Druid

  • dependency in pom.xml:
<dependency>
<groupId>com.alibaba</groupId>
<artifactId>druid</artifactId>
<version>1.1.20</version>
</dependency>
  • Examples:
public static void main(String[] args) throws Exception {
Properties properties = new Properties();
properties.put("driverClassName","com.taosdata.jdbc.TSDBDriver");
properties.put("url","jdbc:TAOS://127.0.0.1:6030/log");
properties.put("username","root");
properties.put("password","taosdata");

properties.put("maxActive","10"); //maximum number of connection in the pool
properties.put("initialSize","3");//initial number of connection
properties.put("maxWait","10000");//maximum wait milliseconds for get connection from pool
properties.put("minIdle","3");//minimum number of connection in the pool

properties.put("timeBetweenEvictionRunsMillis","3000");// the interval milliseconds to test connection

properties.put("minEvictableIdleTimeMillis","60000");//the minimum milliseconds to keep idle
properties.put("maxEvictableIdleTimeMillis","90000");//the maximum milliseconds to keep idle

properties.put("validationQuery","describe log.dn"); //validation query
properties.put("testWhileIdle","true"); // test connection while idle
properties.put("testOnBorrow","false"); // don't need while testWhileIdle is true
properties.put("testOnReturn","false"); // don't need while testWhileIdle is true

//create druid datasource
DataSource ds = DruidDataSourceFactory.createDataSource(properties);
Connection connection = ds.getConnection(); // get connection
Statement statement = connection.createStatement(); // get statement

//query or insert
// ...

connection.close(); // put back to conneciton pool
}

More instructions can refer to User Guide

Notice

  • TDengine v1.6.4.1 provides a function select server_status() to check heartbeat. It is highly recommended to use this function for Validation Query.

As follows,1 will be returned if select server_status() is successfully executed。

taos> select server_status();
server_status()|
================
1 |
Query OK, 1 row(s) in set (0.000141s)

Integrated with framework

  • Please refer to SpringJdbcTemplate if using taos-jdbcdriver in Spring JdbcTemplate
  • Please refer to springbootdemo if using taos-jdbcdriver in Spring JdbcTemplate

FAQ

  • java.lang.UnsatisfiedLinkError: no taos in java.library.path

    Cause:The application program cannot find Library function taos

    Answer:Copy C:\TDengine\driver\taos.dll to C:\Windows\System32\ on Windows and make a soft link through ln -s /usr/local/taos/driver/libtaos.so.x.x.x.x /usr/lib/libtaos.so on Linux.

  • java.lang.UnsatisfiedLinkError: taos.dll Can't load AMD 64 bit on a IA 32-bit platform

    Cause:Currently TDengine only support 64bit JDK

    Answer:re-install 64bit JDK.

  • For other questions, please refer to Issues

Python Connector

Pre-requirement

  • TDengine installed, TDengine-client installed if on Windows
  • python 2.7 or >= 3.4
  • pip installed

Installation

Linux

Users can find python client packages in our source code directory src/connector/python. There are two directories corresponding to two python versions. Please choose the correct package to install. Users can use pip command to install:

pip install src/connector/python/linux/python3/

or

pip install src/connector/python/linux/python2/

Windows

Assumed the Windows TDengine client has been installed , copy the file "C:\TDengine\driver\taos.dll" to the folder "C:\windows\system32", and then enter the cmd Windows command interface

cd C:\TDengine\connector\python\windows
pip install python3\

or

cd C:\TDengine\connector\python\windows
pip install python2\

*If pip command is not installed on the system, users can choose to install pip or just copy the taos directory in the python client directory to the application directory to use.

Usage

Examples

  • import TDengine module
import taos 
  • get the connection
conn = taos.connect(host="127.0.0.1", user="root", password="taosdata", config="/etc/taos")
c1 = conn.cursor()

*host is the IP of TDengine server, and config is the directory where exists the TDengine client configure file

  • insert records into the database
import datetime

# create a database
c1.execute('create database db')
c1.execute('use db')
# create a table
c1.execute('create table tb (ts timestamp, temperature int, humidity float)')
# insert a record
start_time = datetime.datetime(2019, 11, 1)
affected_rows = c1.execute('insert into tb values (\'%s\', 0, 0.0)' %start_time)
# insert multiple records in a batch
time_interval = datetime.timedelta(seconds=60)
sqlcmd = ['insert into tb values']
for irow in range(1,11):
start_time += time_interval
sqlcmd.append('(\'%s\', %d, %f)' %(start_time, irow, irow*1.2))
affected_rows = c1.execute(' '.join(sqlcmd))
  • query the database
c1.execute('select * from tb')
# fetch all returned results
data = c1.fetchall()
# data is a list of returned rows with each row being a tuple
numOfRows = c1.rowcount
numOfCols = len(c1.description)
for irow in range(numOfRows):
print("Row%d: ts=%s, temperature=%d, humidity=%f" %(irow, data[irow][0], data[irow][1],data[irow][2]))

# use the cursor as an iterator to retrieve all returned results
c1.execute('select * from tb')
for data in c1:
print("ts=%s, temperature=%d, humidity=%f" %(data[0], data[1],data[2])
  • create a subscription
# Create a subscription with topic 'test' and consumption interval 1000ms.
# The first argument is True means to restart the subscription;
# if the subscription with topic 'test' has already been created, then pass
# False to this argument means to continue the existing subscription.
sub = conn.subscribe(True, "test", "select * from meters;", 1000)
  • consume a subscription
data = sub.consume()
for d in data:
print(d)
  • close the subscription
sub.close()
  • close the connection
c1.close()
conn.close()

Help information

Users can get module information from Python help interface or refer to our python code example. We list the main classes and methods below:

  • TDengineConnection class

    Run help(taos.TDengineConnection) in python terminal for details.

  • TDengineCursor class

    Run help(taos.TDengineCursor) in python terminal for details.

  • connect method

    Open a connection. Run help(taos.connect) in python terminal for details.

RESTful Connector

TDengine also provides RESTful API to satisfy developing on different platforms. Unlike other databases, TDengine RESTful API applies operations to the database through the SQL command in the body of HTTP POST request. What users are required to provide is just a URL.

For the time being, TDengine RESTful API uses a <TOKEN> generated from username and password for identification. Safer identification methods will be provided in the future.

HTTP URL encoding

To use TDengine RESTful API, the URL should have the following encoding format:

http://<ip>:<PORT>/rest/sql
  • ip: IP address of any node in a TDengine cluster
  • PORT: TDengine HTTP service port. It is 6020 by default.

For example, the URL encoding http://192.168.0.1:6020/rest/sql used to send HTTP request to a TDengine server with IP address as 192.168.0.1.

It is required to add a token in an HTTP request header for identification.

Authorization: Basic <TOKEN>

The HTTP request body contains the SQL command to run. If the SQL command contains a table name, it should also provide the database name it belongs to in the form of <db_name>.<tb_name>. Otherwise, an error code is returned.

For example, use curl command to send a HTTP request:

curl -H 'Authorization: Basic <TOKEN>' -d '<SQL>' <ip>:<PORT>/rest/sql

or use

curl -u username:password -d '<SQL>' <ip>:<PORT>/rest/sql

where TOKEN is the encryted string of {username}:{password} using the Base64 algorithm, e.g. root:taosdata will be encoded as cm9vdDp0YW9zZGF0YQ==

HTTP response

The HTTP resonse is in JSON format as below:

{
"status": "succ",
"head": ["column1","column2", …],
"data": [
["2017-12-12 23:44:25.730", 1],
["2017-12-12 22:44:25.728", 4]
],
"rows": 2
}

Specifically,

  • status: the result of the operation, success or failure
  • head: description of returned result columns
  • data: the returned data array. If no data is returned, only an affected_rows field is listed
  • rows: the number of rows returned

Example

  • Use curl command to query all the data in table t1 of database demo:

    curl -H 'Authorization: Basic cm9vdDp0YW9zZGF0YQ==' -d 'select * from demo.t1' 192.168.0.1:6020/rest/sql

The return value is like:

{
"status": "succ",
"head": ["column1","column2","column3"],
"data": [
["2017-12-12 23:44:25.730", 1, 2.3],
["2017-12-12 22:44:25.728", 4, 5.6]
],
"rows": 2
}
  • Use HTTP to create a database:

    curl -H 'Authorization: Basic cm9vdDp0YW9zZGF0YQ==' -d 'create database demo' 192.168.0.1:6020/rest/sql

    The return value should be:

{
"status": "succ",
"head": ["affected_rows"],
"data": [[1]],
"rows": 1,
}

Go Connector

TDengine also provides a Go client package named taosSql for users to access TDengine with Go. The package is in /usr/local/taos/connector/go/src/taosSql by default if you installed TDengine. Users can copy the directory /usr/local/taos/connector/go/src/taosSql to the src directory of your project and import the package in the source code for use.

import (
"database/sql"
_ "taosSql"
)

The taosSql package is in cgo form, which calls TDengine C/C++ sync interfaces. So a connection is allowed to be used by one thread at the same time. Users can open multiple connections for multi-thread operations.

Please refer the the demo code in the package for more information.

Node.js Connector

TDengine also provides a node.js connector package that is installable through npm. The package is also in our source code at src/connector/nodejs/. The following instructions are also available here

To get started, just type in the following to install the connector through npm.

npm install td-connector

It is highly suggested you use npm. If you don't have it installed, you can also just copy the nodejs folder from src/connector/nodejs/ into your node project folder.

To interact with TDengine, we make use of the node-gyp library. To install, you will need to install the following depending on platform (the following instructions are quoted from node-gyp)

On Unix

  • python (v2.7 recommended, v3.x.x is not supported)
  • make
  • A proper C/C++ compiler toolchain, like GCC

On macOS

  • python (v2.7 recommended, v3.x.x is not supported) (already installed on macOS)

  • Xcode

    • You also need to install the

      Command Line Tools

      via Xcode. You can find this under the menu

      Xcode -> Preferences -> Locations

      (or by running

      xcode-select --install

      in your Terminal)

      • This step will install gcc and the related toolchain containing make

On Windows

Option 1

Install all the required tools and configurations using Microsoft's windows-build-tools using npm install --global --production windows-build-tools from an elevated PowerShell or CMD.exe (run as Administrator).

Option 2

Install tools and configuration manually:

  • Install Visual C++ Build Environment: Visual Studio Build Tools (using "Visual C++ build tools" workload) or Visual Studio 2017 Community (using the "Desktop development with C++" workload)
  • Install Python 2.7 (v3.x.x is not supported), and run npm config set python python2.7 (or see below for further instructions on specifying the proper Python version and path.)
  • Launch cmd, npm config set msvs_version 2017

If the above steps didn't work for you, please visit Microsoft's Node.js Guidelines for Windows for additional tips.

To target native ARM64 Node.js on Windows 10 on ARM, add the components "Visual C++ compilers and libraries for ARM64" and "Visual C++ ATL for ARM64".

Usage

Connection

To use the connector, first require the library td-connector. Running the function taos.connect with the connection options passed in as an object will return a TDengine connection object. The required connection option is host, other options if not set, will be the default values as shown below.

A cursor also needs to be initialized in order to interact with TDengine from Node.js.

const taos = require('td-connector');
var conn = taos.connect({host:"127.0.0.1", user:"root", password:"taosdata", config:"/etc/taos",port:0})
var cursor = conn.cursor(); // Initializing a new cursor

To close a connection, run

conn.close();

Queries

We can now start executing simple queries through the cursor.query function, which returns a TaosQuery object.

var query = cursor.query('show databases;')

We can get the results of the queries through the query.execute() function, which returns a promise that resolves with a TaosResult object, which contains the raw data and additional functionalities such as pretty printing the results.

var promise = query.execute();
promise.then(function(result) {
result.pretty(); //logs the results to the console as if you were in the taos shell
});

You can also query by binding parameters to a query by filling in the question marks in a string as so. The query will automatically parse what was binded and convert it to the proper format for use with TDengine

var query = cursor.query('select * from meterinfo.meters where ts <= ? and areaid = ?;').bind(new Date(), 5);
query.execute().then(function(result) {
result.pretty();
})

The TaosQuery object can also be immediately executed upon creation by passing true as the second argument, returning a promise instead of a TaosQuery.

var promise = cursor.query('select * from meterinfo.meters where v1 = 30;', true)
promise.then(function(result) {
result.pretty();
})

Async functionality

Async queries can be performed using the same functions such as cursor.execute, TaosQuery.execute, but now with _a appended to them.

Say you want to execute an two async query on two seperate tables, using cursor.query, you can do that and get a TaosQuery object, which upon executing with the execute_a function, returns a promise that resolves with a TaosResult object.

var promise1 = cursor.query('select count(*), avg(v1), avg(v2) from meter1;').execute_a()
var promise2 = cursor.query('select count(*), avg(v1), avg(v2) from meter2;').execute_a();
promise1.then(function(result) {
result.pretty();
})
promise2.then(function(result) {
result.pretty();
})

Example

An example of using the NodeJS connector to create a table with weather data and create and execute queries can be found here (The preferred method for using the connector)

An example of using the NodeJS connector to achieve the same things but without all the object wrappers that wrap around the data returned to achieve higher functionality can be found here