{"id":13529535,"url":"https://github.com/bearlord/pdo_taos","last_synced_at":"2026-01-24T20:59:21.884Z","repository":{"id":37309687,"uuid":"435442326","full_name":"bearlord/pdo_taos","owner":"bearlord","description":"TDengine driver for PDO","archived":false,"fork":false,"pushed_at":"2022-09-07T01:12:57.000Z","size":150,"stargazers_count":40,"open_issues_count":0,"forks_count":3,"subscribers_count":3,"default_branch":"main","last_synced_at":"2024-11-02T16:34:57.695Z","etag":null,"topics":["extension","iot","pdo","php","taos","tdengine","time-series"],"latest_commit_sha":null,"homepage":"http://pecl.php.net/package/PDO_TAOS","language":"C","has_issues":true,"has_wiki":null,"has_pages":null,"mirror_url":null,"source_name":null,"license":"apache-2.0","status":null,"scm":"git","pull_requests_enabled":true,"icon_url":"https://github.com/bearlord.png","metadata":{"files":{"readme":"README-CN.md","changelog":null,"contributing":null,"funding":null,"license":"LICENSE","code_of_conduct":null,"threat_model":null,"audit":null,"citation":null,"codeowners":null,"security":null,"support":null}},"created_at":"2021-12-06T09:53:15.000Z","updated_at":"2024-08-01T21:32:11.000Z","dependencies_parsed_at":"2023-01-17T14:34:48.811Z","dependency_job_id":null,"html_url":"https://github.com/bearlord/pdo_taos","commit_stats":null,"previous_names":[],"tags_count":12,"template":false,"template_full_name":null,"repository_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/bearlord%2Fpdo_taos","tags_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/bearlord%2Fpdo_taos/tags","releases_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/bearlord%2Fpdo_taos/releases","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/bearlord%2Fpdo_taos/manifests","owner_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners/bearlord","download_url":"https://codeload.github.com/bearlord/pdo_taos/tar.gz/refs/heads/main","host":{"name":"GitHub","url":"https://github.com","kind":"github","repositories_count":246670544,"owners_count":20815003,"icon_url":"https://github.com/github.png","version":null,"created_at":"2022-05-30T11:31:42.601Z","updated_at":"2022-07-04T15:15:14.044Z","host_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub","repositories_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories","repository_names_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repository_names","owners_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners"}},"keywords":["extension","iot","pdo","php","taos","tdengine","time-series"],"created_at":"2024-08-01T07:00:37.241Z","updated_at":"2026-01-24T20:59:21.877Z","avatar_url":"https://github.com/bearlord.png","language":"C","funding_links":[],"categories":["Connector"],"sub_categories":[],"readme":"简体中文 | [English](./README.md)\n\nPDO_TAOS是 [涛思数据](https://github.com/taosdata/TDengine) 的PDO驱动。\n\n[涛思数据](https://github.com/taosdata/TDengine) 已同意使用库文件开发PHP扩展。\n\n\n\n# TDengine 简介\n\nTDengine是涛思数据专为物联网、车联网、工业互联网、IT运维等设计和优化的大数据平台。除核心的快10倍以上的时序数据库功能外，还提供缓存、数据订阅、流式计算等功能，最大程度减少研发和运维的复杂度，且核心代码，包括集群功能全部开源（开源协议，AGPL v3.0）。\n\n- 10 倍以上性能提升。定义了创新的数据存储结构，单核每秒就能处理至少2万次请求，插入数百万个数据点，读出一千万以上数据点，比现有通用数据库快了十倍以上。\n- 硬件或云服务成本降至1/5。由于超强性能，计算资源不到通用大数据方案的1/5；通过列式存储和先进的压缩算法，存储空间不到通用数据库的1/10。\n- 全栈时序数据处理引擎。将数据库、消息队列、缓存、流式计算等功能融合一起，应用无需再集成Kafka/Redis/HBase/Spark等软件，大幅降低应用开发和维护成本。\n- 强大的分析功能。无论是十年前还是一秒钟前的数据，指定时间范围即可查询。数据可在时间轴上或多个设备上进行聚合。即席查询可通过Shell/Python/R/Matlab随时进行。\n- 与第三方工具无缝连接。不用一行代码，即可与Telegraf, Grafana, EMQ X, Prometheus, Matlab, R集成。后续还将支持MQTT, OPC, Hadoop，Spark等, BI工具也将无缝连接。\n- 零运维成本、零学习成本。安装、集群一秒搞定，无需分库分表，实时备份。标准SQL，支持JDBC,RESTful，支持Python/Java/C/C++/Go/Node.JS, 与MySQL相似，零学习成本。\n\n\n\n# 安装 PDO_TAOS\n\n## 源码编译安装\n\n```bash\nphpize\n./configure\nmake \u0026\u0026 make install\n```\n\n\n\n## 开启 pdo_taos 扩展\n\n编辑 `php.ini` 文件 或者在 `php.d` 目录下新增配置文件。\n\n```ini\nextension=pdo_taos.so\n```\n\n\n\n## 安装TDengine\n\nPDO_TAOS编译时，需要libtaos.so，默认路径为：/usr/lib/libtaos.so，指向路径为：/usr/local/taos/driver/libtaos.so.2.x.x.x。所以需要先安装TDengine数据库服务器端或者C客户端。\n\n\n\n\n\n# 用法\n\n## 0. 创建数据库\n\n客户端完成创建数据库\n\n```sql\nCREATE DATABASE demo;\n```\n\n\n\n## 1. 连接TDengine数据库\n\n```php\n$dbh = new PDO(\"taos:host=127.0.0.1;dbname=demo\", \"root\", \"taosdata\");\n```\n\n\n\n## 2. CREATE 创建数据表\n\n创建数据表与 `MySQL` 语法类似，数据类型也有类似，但是又有区别。\n\n`TDengine` 有自己的数据库类型，`NCHAR` 类似 MySQL 的 `VARCHAR`，`BINARY` 类似 MySQL 的 `TEXT`。\n\n`TDengine` 没有 `PRIMARY KEY`、`AUTO INCREMENT`, `DEFAULT NULL` 等关键字。\n\n`TDengine`的第一列必须是 `TIMESTAMP` 类型。\n\n\n\n例如：\n\n```php\n$dbh = new PDO(\"taos:host=127.0.0.1;dbname=demo\", \"root\", \"taosdata\");\n\n$sql = \"create table device_log_1000 (\ncreated_timestamp TIMESTAMP,\nv_bool BOOL,\nv_tinyint TINYINT,\nv_smallint SMALLINT,\nv_int INT,\nv_bigint BIGINT,\nv_float FLOAT,\nv_double DOUBLE,\nv_binary BINARY(60),\nv_nchar NCHAR(40))\";\n$result = $dbh-\u003eexec($sql);\n\nvar_dump($result);\n```\n\n如果执行成功，`$result` 返回 **0** ；  如果失败了，返回 **-1**。\n\n\n\n执行结束后，登录 `TDengine` 数据库客户端查看数据表结构。\n\n```shell\ntaos\u003e USE DEMO;\nDatabase changed.\n\ntaos\u003e SHOW CREATE TABLE device_log_100;\n             Table              |          Create Table          |\n==================================================================\n device_log_1000                | create table device_log_100... |\nQuery OK, 1 row(s) in set (0.002146s)\n\ntaos\u003e SHOW CREATE TABLE device_log_1000\\G;\n*************************** 1.row ***************************\n       Table: device_log_1000\nCreate Table: create table device_log_1000 (created_timestamp TIMESTAMP,v_bool BOOL,v_tinyint TINYINT,v_smallint SMALLINT,v_int INT,v_bigint BIGINT,v_float FLOAT,v_double DOUBLE,v_binary BINARY(60),v_nchar NCHAR(40))\nQuery OK, 1 row(s) in set (0.000267s)\n\ntaos\u003e \n```\n\n`SHOW CREATE TABLE` 可以查看表结构，显示不全，末尾请加`\\G`。\n\n\n\n## 3. INSERT 插入数据\n\n### 插入数据分两种方式:\n\n1. 调用 `PDO::exec` 方法直接执行 `INSERT` SQL语句。\n2. 调用`PDO::prepare`方法执行预处理操作。\n\n\n\n### 3.1 PDO::exec方式\n\n```php\n$dbh = new PDO(\"taos:host=127.0.0.1;dbname=demo\", \"root\", \"taosdata\");\n\n$sql = \"INSERT INTO device_log_100 (\ncreated_timestamp,\nv_bool,\nv_tinyint,\nv_smallint,\nv_int,\nv_bigint,\nv_float,\nv_double,\nv_binary,\nv_nchar\n) VALUES (\nNOW,\n1,\n120,\n1200,\n12000,\n120000,\n9.09,\n9.000009,\n'hello TDengine',\n'hello PHP'\n)\";\n\n$result = $dbh-\u003eexec($sql);\nvar_dump($result);\n```\n\n执行如果成功，$result 返回 `0` ；  如果失败了，返回 `-1`。\n\n没有方法能获取受影响的行数。\n\n\n\n**注意：**\n\n**一定要调用 `exec` 方法，而不是 `query` 方法。**\n\n\n\n### 3.2 PDO::prepare预处理方式\n\n```php\ntry {\n    $dbh = new PDO(\"taos:host=127.0.0.1;dbname=demo\", \"root\", \"taosdata\");\n\n    $sql = \"INSERT INTO device_log_100 (created_timestamp, v_bool, v_tinyint, v_smallint, v_int, v_bigint, v_float, v_double, v_binary, v_nchar ) VALUES (\n    ?, ?, ?, ?, ?, ?, ?, ?, ?, ?)\";\n    $sth = $dbh-\u003eprepare($sql);\n\n    $v1 = intval(microtime(true) * 1000);\n    $v2 = 1;\n    $v3 = 100;\n    $v4 = 2000;\n    $v5 = 20000;\n    $v6 = 200000;\n    $v7 = 8.08;\n    $v8 = 8.000008;\n    $v9 = \"TDengine test\";\n    $v10 = \"Taos test\";\n\n    $sth-\u003ebindParam(1, $v1, PDO::PARAM_TAOS_TIMESTAMP);\n    $sth-\u003ebindParam(2, $v2, PDO::PARAM_TAOS_BOOL);\n    $sth-\u003ebindParam(3, $v3, PDO::PARAM_TAOS_TINYINT);\n    $sth-\u003ebindParam(4, $v4, PDO::PARAM_TAOS_SMALLINT);\n    $sth-\u003ebindParam(5, $v5, PDO::PARAM_TAOS_INT);\n    $sth-\u003ebindParam(6, $v6, PDO::PARAM_TAOS_BIGINT);\n    $sth-\u003ebindParam(7, $v7, PDO::PARAM_TAOS_FLOAT);\n    $sth-\u003ebindParam(8, $v8, PDO::PARAM_TAOS_DOUBLE);\n    $sth-\u003ebindParam(9, $v9, PDO::PARAM_TAOS_BINARY);\n    $sth-\u003ebindParam(10, $v10, PDO::PARAM_TAOS_NCHAR);\n\n    $result = $sth-\u003eexecute();\n    var_dump($result);\n\n    $rowCount = $sth-\u003erowCount();\n    var_dump($rowCount);\n} catch (Exception $e) {\n    printf(\"%d, %s\\n\", $e-\u003egetCode(), $e-\u003egetMessage());\n}\n```\n\n执行成功，`$result` 返回 true，执行失败，返回false。\n\n `$rowCount`  表示受影响的行数。\n\n\n\n#### 占位符\n\n支持应 `:name` 形式的参数名，也支持 `?` 形式 。\n\n\n\n#### 数据类型\n\n请忘记：`PDO::PARAM_BOOL `、`PDO::PARAM_INT `, `PDO::PARAM_STR` 等PDO预定义类型。\n\n请使用以下的自定义PDO类型：\n\n| PDO自定义类型        | TDengine数据类型         | 说明      |\n| -------------------- | ------------------------ | --------- |\n| PARAM_TAOS_NULL      | TSDB_DATA_TYPE_NULL      | NULL      |\n| PARAM_TAOS_BOOL      | TSDB_DATA_TYPE_BOOL      | BOOL      |\n| PARAM_TAOS_TINYINT   | TSDB_DATA_TYPE_TINYINT   | TINYINT   |\n| PARAM_TAOS_SMALLINT  | TSDB_DATA_TYPE_SMALLINT  | SMALLINT  |\n| PARAM_TAOS_INT       | TSDB_DATA_TYPE_INT       | INT       |\n| PARAM_TAOS_BIGINT    | TSDB_DATA_TYPE_BIGINT    | BIGINT    |\n| PARAM_TAOS_FLOAT     | TSDB_DATA_TYPE_FLOAT     | FLOAT     |\n| PARAM_TAOS_DOUBLE    | TSDB_DATA_TYPE_DOUBLE    | DOUBLE    |\n| PARAM_TAOS_BINARY    | TSDB_DATA_TYPE_BINARY    | BINARY    |\n| PARAM_TAOS_TIMESTAMP | TSDB_DATA_TYPE_TIMESTAMP | TIMESTAMP |\n| PARAM_TAOS_NCHAR     | TSDB_DATA_TYPE_NCHAR     | NCHAR     |\n| PARAM_TAOS_UTINYINT  | TSDB_DATA_TYPE_UTINYINT  | UTINYINT  |\n| PARAM_TAOS_USMALLINT | TSDB_DATA_TYPE_USMALLINT | USMALLINT |\n| PARAM_TAOS_UINT      | TSDB_DATA_TYPE_UINT      | UINT      |\n| PARAM_TAOS_UBIGINT   | TSDB_DATA_TYPE_UBIGINT   | UBIGINT   |\n| PARAM_TAOS_JSON      | TSDB_DATA_TYPE_JSON      | JSON      |\n\n`TSDB_DATA_TYPE_INT` 等常量，与 PDO 预定义常量的值 部分相等，导致判断数据类型时发生冲突，故人为设定 `6000` 的差值。例如：\n\n```c\nPARAM_TAOS_INT = TSDB_DATA_TYPE_INT + 6000\n```\n\n仅做说明，对开发没有影响。\n\n\n\n如果在执行插入操作时，能**预先**获取数据表的**字段类型**，再根据绑定的**数据的类型**，则可以完美兼容，如：\n\nMySQL的字段类型是 `INT`, `SMALLINT`, `TINYINT`, `BIGINT`，绑定参数为`PDO::PARAM_INT` 也可以插入 。\n\n但是`TDengine` 的API在执行 `INSERT`操作时，不能预先获取数据表的字段类型，只能与数据表的字段完全一致，才可以绑定参数。\n\n\n\n### **3.3 不要混写**\n\n`PDO::exec` 写完整的SQL语句，不要占位符。\n\n`PDO::prepare` 一定要 `bindParam` 或者 `bindValue`，避免 `prepare` 没有占位符的 SQL，否则会报错。\n\n\n\n## 4. SELECT查询\n\n查询数据分两种方法:\n\n1. 调用 `PDO::query` 方法直接执行 `SELECT` SQL语句。\n2. 调用 `PDO::prepare `方法执行预处理操作。\n\n\n\n### 4.1 PDO::query方法\n\n```php\n$dbh = new PDO(\"taos:host=127.0.0.1;dbname=demo\", \"root\", \"taosdata\");\n\n$t1 = strtotime(\"2022-01-27 16:36:12\");\n$t2 = strtotime(\"2022-01-27 16:48:13\");\n\n$start_time = intval($t1 * 1000);\n$end_time = intval($t2 * 1000);\n\n$sql = \"SELECT * FROM device_log_100 WHERE created_timestamp \u003e= $start_time AND created_timestamp \u003c= $end_time LIMIT 3 OFFSET 0\";\n$sth = $dbh-\u003equery($sql);\n\n$result = $sth-\u003efetchAll(PDO::FETCH_ASSOC);\nvar_dump($result);\n```\n\n执行结果如下：\n\n```php\narray(3) {\n  [0]=\u003e\n  array(10) {\n    [\"created_timestamp\"]=\u003e\n    string(23) \"2022-01-27 16:36:12.038\"\n    [\"v_bool\"]=\u003e\n    string(1) \"1\"\n    [\"v_tinyint\"]=\u003e\n    string(3) \"100\"\n    [\"v_smallint\"]=\u003e\n    string(4) \"2000\"\n    [\"v_int\"]=\u003e\n    string(5) \"20000\"\n    [\"v_bigint\"]=\u003e\n    string(6) \"200000\"\n    [\"v_float\"]=\u003e\n    string(9) \"8.08000\"\n    [\"v_double\"]=\u003e\n    string(11) \"8.000008000\"\n    [\"v_binary\"]=\u003e\n    string(13) \"TDengine test\"\n    [\"v_nchar\"]=\u003e\n    string(9) \"Taos test\"\n  }\n  [1]=\u003e\n  array(10) {\n    [\"created_timestamp\"]=\u003e\n    string(23) \"2022-01-27 16:36:49.146\"\n    [\"v_bool\"]=\u003e\n    string(1) \"1\"\n    [\"v_tinyint\"]=\u003e\n    string(3) \"100\"\n    [\"v_smallint\"]=\u003e\n    string(4) \"2000\"\n    [\"v_int\"]=\u003e\n    string(5) \"20000\"\n    [\"v_bigint\"]=\u003e\n    string(6) \"200000\"\n    [\"v_float\"]=\u003e\n    string(9) \"8.08000\"\n    [\"v_double\"]=\u003e\n    string(11) \"8.000008000\"\n    [\"v_binary\"]=\u003e\n    string(13) \"TDengine test\"\n    [\"v_nchar\"]=\u003e\n    string(9) \"Taos test\"\n  }\n  [2]=\u003e\n  array(10) {\n    [\"created_timestamp\"]=\u003e\n    string(23) \"2022-01-27 16:36:55.365\"\n    [\"v_bool\"]=\u003e\n    string(1) \"1\"\n    [\"v_tinyint\"]=\u003e\n    string(3) \"100\"\n    [\"v_smallint\"]=\u003e\n    string(4) \"2000\"\n    [\"v_int\"]=\u003e\n    string(5) \"20000\"\n    [\"v_bigint\"]=\u003e\n    string(6) \"200000\"\n    [\"v_float\"]=\u003e\n    string(9) \"8.08000\"\n    [\"v_double\"]=\u003e\n    string(11) \"8.000008000\"\n    [\"v_binary\"]=\u003e\n    string(13) \"TDengine test\"\n    [\"v_nchar\"]=\u003e\n    string(9) \"Taos test\"\n  }\n}\n```\n\n\n\n注意：`created_timestamp` 在查询时候，用的 `时间戳` 类型 , 但查询结果`格式化时间` 类型，这个跟`TDengine`的客户端查询结果保持一致。\n\n\n\n### 4.2 PDO::prepare方法\n\n```php\n$dbh = new PDO(\"taos:host=127.0.0.1;dbname=demo\", \"root\", \"taosdata\");\n\n$t1 = strtotime(\"2022-01-27 16:36:12\");\n$t2 = strtotime(\"2022-01-27 16:48:13\");\n\n$start_time = intval($t1 * 1000);\n$end_time = intval($t2 * 1000);\n\n\n$sql = \"SELECT * FROM device_log_100 WHERE created_timestamp \u003e= :start_time AND created_timestamp \u003c= :end_time LIMIT 3 OFFSET 0\";\n\n$sth = $dbh-\u003eprepare($sql);\n\n$sth-\u003ebindParam(\"start_time\", $start_time, PDO::PARAM_TAOS_TIMESTAMP);\n$sth-\u003ebindParam(\"end_time\", $end_time, PDO::PARAM_TAOS_TIMESTAMP);\n\n\n$sth-\u003eexecute();\n$result = $sth-\u003efetchAll(PDO::FETCH_ASSOC);\nvar_dump($result);\n```\n\n\n\n注意：`created_timestamp` 在绑定参数时候，用的`时间戳`类型 , 但查询结果`格式化时间` 类型，这个跟`TDengine`的客户端查询结果保持一致。\n\n其他绑定的参数，数据类型也要和数据表的字段类型一致。如果用 `PDO::PARAM_INT` 或者 `PDO::PARAM_STR`碰巧运行正常，仅仅是因为运气好而已，不推荐。\n\n\n\n谁也想不到，弱类型的PHP，在操作 `TDengine` 数据库的时候，竟要求 **数据类型** 和 **数据表字段类型** **强一致性**。\n\n\n\n## 5. UPDATE 修改数据\n\n`TDengine` 默认不支持修改操作。向不支持数据更新的表中写入重复时间戳的数据，**后写入**的数据会被**丢弃**。\n\n若用户需要数据的更新功能，则在建库的时候，只需要指定数据库的  **update** 选项为**1**即可。\n\n例如：\n\n```sql\nCREATE DATABASE demo UPDATE 1\n```\n\n在向支持数据更新功能的表中，写入重复时间戳的数据时，**老数据**会被**覆盖** ， \n\n\n\n## 6. DELETE 删除数据\n\n截止到现在， `TDengine` 版本是 `V2.4`, 数据表暂不支持DELETE操作。\n\n但是**数据库**支持自动删除，删除时间与 创建数据库时候指定的`keep`参数有关系，默认3650天，即10年。10年后这个数据库会自动逻辑删除，数据库文件自动备份到适当位置。\n\n\n\n# 其他\n\n`PDO` 连接 `TDengine`, 可以不指定数据库。例如：\n\n```php\n$dbh = new PDO(\"taos:host=127.0.0.1\", \"root\", \"taosdata\");\n```\n\n\n\n`TDengine`的数据库有保存时间，默认10年。\n\n如果设备日志保存为单数据库，3年前的设备日志已没有参考意义，但又不能删除数据，导致占用硬盘空间，同时影响数据库的运行速度。\n\n如果设备日志保存为按 **年** 区分的多个数据库。不会导致单数据库和数据集过大，保持了插入和查询数据的高效性。没有意义的设备日志，可以删除、归档。\n\n\n\n例如：\n\n```php\ntry {\n    $dbh = new PDO(\"taos:host=127.0.0.1\", \"root\", \"taosdata\");\n    \n    $year = date(\"Y\");\n    $database = sprintf(\"demo_%s\", $year);\n\n    $sql = \"INSERT INTO {$database}.device_log_100 (created_timestamp, v_bool, v_tinyint, v_smallint, v_int, v_bigint, v_float, v_double, v_binary, v_nchar ) VALUES (\n    ?, ?, ?, ?, ?, ?, ?, ?, ?, ?)\";\n    $sth = $dbh-\u003eprepare($sql);\n\n    $v1 = intval(microtime(true) * 1000);\n    $v2 = 1;\n    $v3 = 100;\n    $v4 = 2000;\n    $v5 = 20000;\n    $v6 = 200000;\n    $v7 = 8.08;\n    $v8 = 8.000008;\n    $v9 = \"TDengine test\";\n    $v10 = \"Taos test\";\n\n    $sth-\u003ebindParam(1, $v1, PDO::PARAM_TAOS_TIMESTAMP);\n    $sth-\u003ebindParam(2, $v2, PDO::PARAM_TAOS_BOOL);\n    $sth-\u003ebindParam(3, $v3, PDO::PARAM_TAOS_TINYINT);\n    $sth-\u003ebindParam(4, $v4, PDO::PARAM_TAOS_SMALLINT);\n    $sth-\u003ebindParam(5, $v5, PDO::PARAM_TAOS_INT);\n    $sth-\u003ebindParam(6, $v6, PDO::PARAM_TAOS_BIGINT);\n    $sth-\u003ebindParam(7, $v7, PDO::PARAM_TAOS_FLOAT);\n    $sth-\u003ebindParam(8, $v8, PDO::PARAM_TAOS_DOUBLE);\n    $sth-\u003ebindParam(9, $v9, PDO::PARAM_TAOS_BINARY);\n    $sth-\u003ebindParam(10, $v10, PDO::PARAM_TAOS_NCHAR);\n\n    $result = $sth-\u003eexecute();\n    var_dump($result);\n\n    $rowCount = $sth-\u003erowCount();\n    var_dump($rowCount);\n} catch (Exception $e) {\n    printf(\"%d, %s\\n\", $e-\u003egetCode(), $e-\u003egetMessage());\n}\n```\n\n","project_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fbearlord%2Fpdo_taos","html_url":"https://awesome.ecosyste.ms/projects/github.com%2Fbearlord%2Fpdo_taos","lists_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fbearlord%2Fpdo_taos/lists"}