1. 程式人生 > >Openresty最佳案例 | 第6篇:OpenResty連線Mysql

Openresty最佳案例 | 第6篇:OpenResty連線Mysql

centos 安裝mysl

Centos系統下安裝mysql,先下載mysql-community-release-el7-5.noarch.rpm,然後通過yum安裝,安裝過程一直確定【Y】即可。

cd /usr/downloads/

wget http://dev.mysql.com/get/mysql-community-release-el7-5.noarch.rpm

rpm -ivh mysql-community-release-el7-5.noarch.rpm

yum install mysql-community-server


安裝成功後,重啟mysql,並進入mysql資料庫,給root使用者設定一個密碼,密碼為“123”。

service mysqld restart

mysql -u root -p

set password for [email protected] = password('123'); 

openresty連線mysql

lua-resty-mysql - Lua MySQL client driver for ngx_lua based on the cosocket API

lua-resty-mysql模組是基於cosocket API 為ngx_lua提供的一個Lua MySQL客戶端。它保證了100%非阻塞。

vim /usr/example/lua/test_mysql.lua,新增以下的程式碼:

local function close_db(db)  
    if not db then  
        return  
    end  
    db:close()  
end  
  
local mysql = require("resty.mysql")  
 
local db, err = mysql:new()  
if not db then  
    ngx.say("new mysql error : ", err)  
    return  
end  

db:set_timeout(1000)  
  
local props = {  
    host = "127.0.0.1",  
    port = 3306,  
    database = "mysql",  
    user = "root",  
    password = "123"  
}  
  
local res, err, errno, sqlstate = db:connect(props)  
  
if not res then  
   ngx.say("connect to mysql error : ", err, " , errno : ", errno, " , sqlstate : ", sqlstate)  
   return close_db(db)  
end  
 
local drop_table_sql = "drop table if exists test"  
res, err, errno, sqlstate = db:query(drop_table_sql)  
if not res then  
   ngx.say("drop table error : ", err, " , errno : ", errno, " , sqlstate : ", sqlstate)  
   return close_db(db)  
end  
  

local create_table_sql = "create table test(id int primary key auto_increment, ch varchar(100))"  
res, err, errno, sqlstate = db:query(create_table_sql)  
if not res then  
   ngx.say("create table error : ", err, " , errno : ", errno, " , sqlstate : ", sqlstate)  
   return close_db(db)  
end  
  

local insert_sql = "insert into test (ch) values('hello')"  
res, err, errno, sqlstate = db:query(insert_sql)  
if not res then  
   ngx.say("insert error : ", err, " , errno : ", errno, " , sqlstate : ", sqlstate)  
   return close_db(db)  
end  
  
res, err, errno, sqlstate = db:query(insert_sql)  
  
ngx.say("insert rows : ", res.affected_rows, " , id : ", res.insert_id, "<br/>")  
  
 
local update_sql = "update test set ch = 'hello2' where id =" .. res.insert_id  
res, err, errno, sqlstate = db:query(update_sql)  
if not res then  
   ngx.say("update error : ", err, " , errno : ", errno, " , sqlstate : ", sqlstate)  
   return close_db(db)  
end  
  
ngx.say("update rows : ", res.affected_rows, "<br/>")  
  
local select_sql = "select id, ch from test"  
res, err, errno, sqlstate = db:query(select_sql)  
if not res then  
   ngx.say("select error : ", err, " , errno : ", errno, " , sqlstate : ", sqlstate)  
   return close_db(db)  
end  
  
  
for i, row in ipairs(res) do  
   for name, value in pairs(row) do  
     ngx.say("select row ", i, " : ", name, " = ", value, "<br/>")  
   end  
end  
  
ngx.say("<br/>")  
  
local ch_param = ngx.req.get_uri_args()["ch"] or ''  
 
local query_sql = "select id, ch from test where ch = " .. ngx.quote_sql_str(ch_param)  
res, err, errno, sqlstate = db:query(query_sql)  
if not res then  
   ngx.say("select error : ", err, " , errno : ", errno, " , sqlstate : ", sqlstate)  
   return close_db(db)  
end  
  
for i, row in ipairs(res) do  
   for name, value in pairs(row) do  
     ngx.say("select row ", i, " : ", name, " = ", value, "<br/>")  
   end  
end  
  

local delete_sql = "delete from test"  
res, err, errno, sqlstate = db:query(delete_sql)  
if not res then  
   ngx.say("delete error : ", err, " , errno : ", errno, " , sqlstate : ", sqlstate)  
   return close_db(db)  
end  
  
ngx.say("delete rows : ", res.affected_rows, "<br/>")  
  
  
close_db(db)  


在上面的程式碼中,展示了基本的創表、插入資料、修改資料、查詢資料、刪除資料的一些功能。

其中用到的lua-resty-mysql的一些API方法:

  • syntax: db, err = mysql:new() 建立一個mysql資料庫連線物件
  • syntax: ok, err = db:connect(options) 嘗試遠端連線mysql
    • host mysql的主機名
    • port 埠
    • database 資料庫名
    • user 使用者名稱
    • password 密碼
    • charset 編碼
  • syntax: db:set_timeout(time) 設定資料庫連線超時時間
  • syntax: ok, err = db:set_keepalive(max_idle_timeout, pool_size) 設定連線池
  • syntax: ok, err = db:close() 關閉資料庫
  • syntax: bytes, err = db:send_query(query) 傳送查詢

lua-resty-mysql的一些關鍵的API方法,見https://github.com/openresty/lua-resty-mysql#table-of-contents

vim /usr/example/example.conf 在配置檔案配置:


location /lua_mysql {
   default_type 'text/html';
   lua_code_cache on;
   content_by_lua_file /usr/example/lua/test_mysql.lua;
 }

瀏覽器訪問http://116.196.177.123/lua_mysql,瀏覽器顯示以下的內容:

insert rows : 1 , id : 2
update rows : 1
select row 1 : ch = hello
select row 1 : id = 1
select row 2 : ch = hello2
select row 2 : id = 2

delete rows : 2


掃碼關注公眾號有驚喜

(轉載本站文章請註明作者和出處 方誌朋的部落格

相關推薦

Openresty最佳案例 | 6OpenResty連線Mysql

centos 安裝mysl Centos系統下安裝mysql,先下載mysql-community-release-el7-5.noarch.rpm,然後通過yum安裝,安裝過程一直確定【Y】即可。 cd /usr/downloads/ wget http:

Openresty最佳案例 | 9Openresty實現的閘道器許可權控制

簡介 採用openresty 開發出的api閘道器有很多,比如比較流行的kong、orange等。這些API 閘道器通過提供外掛的形式,提供了非常多的功能。這些元件化的功能往往能夠滿足大部分的需求,如果要想達到特定場景的需求,可能需要二次開發,比如RBAC許可

Openresty最佳案例 | 7 模組開發、OpenResty連線Redis

Lua模組開發 在實際的開發過程中,不可能把所有的lua程式碼寫在一個lua檔案中,通常的做法將特定功能的放在一個lua檔案中,即用lua模組開發。在lualib目錄下,預設有以下的lua模組。 lualib/ ├── cjson.so ├── ngx │

Openresty最佳案例 | 1Nginx介紹

Nginx 簡介 Nginx是一個高效能的Web 伺服器,同時是一個高效的反向代理伺服器,它還是一個IMAP/POP3/SMTP 代理伺服器。 由於Nginx採用的是事件驅動的架構,能夠處理併發百萬級別的tcp連線,高度的模組化設計和自由的BSD許可,使得Ng

讀書筆記 ---- 《深入理解Java虛擬機器》---- 6虛擬機器類載入機制

上一篇:類檔案結構:https://blog.csdn.net/pcwl1206/article/details/84197219 第6篇:虛擬機器類載入機制 1、概述 上一篇文章中講訴了Class檔案儲存格式的具體細節,在Class檔案中的描述的各種資訊,最終都要載入到虛擬機器中之後才

【搞定Java併發程式設計】6ThreadLocal詳解

上一篇:synchronized關鍵字:https://blog.csdn.net/pcwl1206/article/details/84849400 目  錄: 1、ThreadLocal是什麼? 2、ThreadLocal使用示例 3、ThreadLocal原始碼分析

Spring-Cloud系列6spring-cloud-bus

介紹 在之前的Spring Cloud Config的介紹中,我們還留了一個懸念:如何實現對配置資訊的實時更新。 通過/refresh介面和Git倉庫的Web Hook來實現Git倉庫中的內容修改觸發應用程式的屬性更新這是一個好的方法,但是我沒講,因

【搞定MySQL資料庫】6索引的概述

本文為本人學習極客時間《MySQL實戰45講》的學習筆記。 原文連結:https://time.geekbang.org/column/article/69236                  &n

Maven系列6生命週期和外掛詳解,此看過之後在maven的理解上可以超越同級別90%的人!

maven系列目標:從入門開始開始掌握一個高階開發所需要的maven技能。 這是maven系列第6篇。 整個maven系列的內容前後是有依賴的,如果之前沒有接觸過maven,建議從第一篇看起,本文尾部有maven完整系列的連線。 前面我們使用maven過程中,用到了一些命令,如下: mvn clean mvn

6 django rest framework 分頁介面

![](https://img2020.cnblogs.com/blog/759200/202004/759200-20200415161158343-1662112908.jpg) 作者:[HelloGitHub-追夢人物](https://www.zmrenwu.com) 如果沒有設定分頁,djang

恕我直言你可能真的不會java6Stream效能差?不要人云亦云

## 一、粉絲的反饋 ![](https://img2020.cnblogs.com/other/1815316/202006/1815316-20200624093741455-532502751.png) **問:stream比for迴圈慢5倍,用這個是為了啥?** 答:網際網路是一個新聞氾濫的時代,三

機器學習 6線性模型概述

在迴歸分析中,線性模型的一般預測公式是: 是預測值,讀作"y hat",是特徵的線性組合,把向量w稱作 coef_(係數),公式是:    把w0稱作intercept_(截距),這兩個屬性是線性模型的共有屬性。 一,線性迴歸 最基本的線性模型是線性迴歸,也稱作最小二乘法(OL

易筋SpringBoot 2.1 | JdbcTemplate訪問MySQL

寫作時間:2019-01-03 Spring Boot: 2.1 ,JDK: 1.8, IDE: IntelliJ IDEA, MySQL 8.0.13 說明 資料需要持久化儲存,無論是客戶端的SQLLITE,還是服務端的MySQL。這裡記錄最原始的訪問資料庫方式,JdbcTempl

Mysql高手系列 - 22深入理解mysql索引原理,連載中

Mysql系列的目標是:通過這個系列從入門到全面掌握一個高階開發所需要的全部技能。 歡迎大家加我微信itsoku一起交流java、演算法、資料庫相關技術。 這是Mysql系列第22篇。 背景 使用mysql最多的就是查詢,我們迫切的希望mysql能查詢的更快一些,我們經常用到的查詢有: 按照id查詢唯一一條

jdbc6使用properties當做Dbc的配置檔案

  這節課我們實現一個功能,我們把連線mysql要用到的資訊放在properties配置檔案裡,讓Dbc載入這個檔案讀取配置資訊給我們返回一個Connection物件   實現: package com.tool; import java.io.*; impo

HTML5學習6—video自己實現video的播放控制元件(新增樣式版)

     本篇部落格接著上一篇文章,實現了一個帶樣式的video播放控制元件,程式碼如下: <!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8">

mysql學習【6資料庫之表與表之間的關係 資料庫之 表與表之間的關係

資料庫之 表與表之間的關係 表1 foreign key 表2 則表1的多條記錄對應表2的一條記錄,即多對一

Django學習【6Django之ORM單表操作(增刪改查)

大小寫 則表達式 分享 cnblogs 可能 集合 數據庫 cut 對象 django之數據庫表的單表查詢 一、添加表記錄 對於單表有兩種方式 # 添加數據的兩種方式 # 方式一:實例化對象就是一條表記錄

Spring Cloud系列教程 | 使用Spring Cloud Zuul實現過濾器或攔截器功能案例

推薦 Spring Cloud 視訊: 使用Spring Cloud Zuul實現過濾器或攔截器功能案例   Spring Cloud的API閘道器不但可以實現類似NGINX+Lua強大的路由分發,實現動靜頁面的分流,更重要可以實現對所有發往後端微服務請求的攔

深入理解iputils網路工具-6 rarpd逆地址解析程式

6.1       引言     通過逆地址解析協議RARP,客戶端可以通過硬體地址得到對應的IP地址,一般用於無盤系統中,用以獲得自身的IP地址。rarpd就是處理RARP請求的伺服器程式。     RARP分組的格式與ARP分組基本一致。它們之間主要的差別是RARP請求或應答的幀型別程式碼為0x8035