App下載

無需代碼,使用API操作數(shù)據(jù)庫

猿友 2020-08-26 11:34:17 瀏覽數(shù) (8212)
反饋

前言

對(duì)于編程人員來說,數(shù)據(jù)庫是必須要接觸的,但操作起來卻一點(diǎn)都不簡單,要用到好幾種管理工具,好幾種連接方式。假如有一個(gè)工具能適用各種數(shù)據(jù)庫,讓我們節(jié)省大量工作,那該多好。歷盡千辛萬苦,我總算找到了這么個(gè)工具,不僅支持多種數(shù)據(jù)庫,更厲害的是,不用為適配寫一行代碼,來了解下吧。

神器出場(chǎng)

今天的主角是 sandman2

可以基于已存在的數(shù)據(jù)庫,自動(dòng)生成一個(gè) RESTful API 服務(wù)器,而不需要寫任何代碼,用作者的話說,簡單地就像給食物加點(diǎn)鹽

更厲害的是,從簡單地 SQLite 數(shù)據(jù)庫,到大型的商業(yè)數(shù)據(jù) PostgreSQL, 都能完美支持,且不用寫一行代碼

目前支持的數(shù)據(jù)庫:

  • MySQL
  • PostgreSQL
  • Oracle
  • Microsoft SQL Server
  • SQLite
  • Sybase
  • Drizzle
  • Firebird

這讓我想起了曾經(jīng)因?yàn)檎也坏胶线m的數(shù)據(jù)庫框架手忙腳亂的日子,如果早點(diǎn)知道 sandman2 就好了

之所以叫 sandman2,是因?yàn)樗那拜吺?sandman,sandman 已經(jīng)有了很強(qiáng)的數(shù)據(jù)庫支持能力,不過在 SQLAlchemy 0.9 版本中,增加了 automap功能,可以進(jìn)一步使 sandman 得到簡化,于是重寫了 sandman,就有了 sandman2,并且 sandman2 的功能遠(yuǎn)超 sandman

使用 pip 安裝 pip install sandman2

安裝成功后,就可以得到一個(gè) sandman2ctl 命令行工具,用它來啟動(dòng)一個(gè) RESTful API 服務(wù)器

不用寫一行代碼,直接啟動(dòng):

sandman2ctl sqlite+pysqlite:///data.db

注意:如果用的 python 版本是 3.8 及以上,且在 Windows 上,執(zhí)行時(shí)可能會(huì)遇到,AttributeError: module 'time' has no attribute 'clock' 的錯(cuò)誤 這是因?yàn)?3.8 以后 time 模塊的 clock 屬性換成了perf_counter() 方法,所以需要修改下 lib\site-packages\sqlalchemy\util\compat.py 的 331 行,將 time_func = time.clock 換成 time_func = time.perf_counter() 保存即可

啟動(dòng)之后,默認(rèn)端口是 5000,訪問地址是 http://localhost:5000/admin就能看到服務(wù)器控制臺(tái)了

啟動(dòng)之后

數(shù)據(jù)庫連接

前面已經(jīng)看到連接 SQLite 數(shù)據(jù)的方法

sandman2 是基于 SQLAlchemy 的,所以使用連接 Url 來連接數(shù)據(jù)庫

格式為

dialect+driver://username:password@host:port/database

  • dialect 為數(shù)據(jù)庫類型,如 mysql、SQLite 等
  • driver 為數(shù)據(jù)庫驅(qū)動(dòng)模塊名,例如 pymysql、psycopg2、mysqldb 等,如果忽略,表示使用默認(rèn)驅(qū)動(dòng)

以 mysql 數(shù)據(jù)庫為例:

sandman2ctl 'mysql+pymysql://bob:bobpasswd@localhost:3306/testdb'

如果環(huán)境中沒有安裝 pymysql 模塊,必須先安裝,才能正常啟動(dòng)

其他數(shù)據(jù)庫的連接方式可參考 SQLAlchemy 的 引擎配置 章節(jié), 在這里查看 docs.sqlalchemy.org/en/13/core/engines.html

控制臺(tái)

需要快速預(yù)覽數(shù)據(jù),對(duì)數(shù)據(jù)進(jìn)行簡單調(diào)整的話,控制臺(tái)很有用

左側(cè)菜單除了 Home 外,其他的都是庫表名稱

點(diǎn)擊相應(yīng)庫表名稱,會(huì)在右側(cè)顯示表內(nèi)數(shù)據(jù),并且可以做增刪改操作

庫表數(shù)據(jù)

點(diǎn)擊新增,打開新增頁面:

新增頁面

用過 Django 的同學(xué)會(huì)感覺很熟悉,不過字段并沒有類型支持,只能以字符串輸入,自行確保數(shù)據(jù)類型正確,否則保存時(shí)會(huì)收到錯(cuò)誤信息

點(diǎn)擊記錄前面的筆狀圖標(biāo),會(huì)進(jìn)入編輯頁面

編輯頁面

點(diǎn)擊記錄前的刪除圖標(biāo),來刪除記錄

另外多選數(shù)據(jù)后,可以通過 With selected 菜單下的 Delete 按鈕來批量刪除

控制臺(tái)方便易用,適合一些簡單的、數(shù)據(jù)量少的操作

注意:由于控制臺(tái)不能登錄即可訪問,建議將服務(wù)器創(chuàng)建在本地或內(nèi)網(wǎng)環(huán)境中

API

以 RESTful 的角度來看,庫表相當(dāng)于資源(resource),一組資源相當(dāng)于集合(collection)

以下測(cè)驗(yàn),均采用 curl 工具進(jìn)行,具體用法可參考 阮一峰的 《curl 的用法指南》(www.ruanyifeng.com/blog/2019/09/curl-reference.html)

查詢

通過 Http GET 方法,以 JSON 格式將數(shù)據(jù)返回,例如返回 學(xué)生表 student的所有記錄:

$ curl http://localhost:5000/student/


{"resources":[{"age":18,"class":"1","id":1,"name":"\u5f20\u4e09","profile":"\u64c5\u957f\u5b66\u4e60"},...

注意:資源要以 / 結(jié)尾

通過參數(shù) page 來分頁,例如返回 學(xué)生表 student 的第一頁數(shù)據(jù)

$ curl http://localhost:5000/student/?page=1
{"resources":[{"age":18,"class":"1"...

通過參數(shù) limit 顯示返回行數(shù)

如果要獲取具體記錄,可以用主鍵值作為節(jié)段,例如獲取 id 為 3 的學(xué)生記錄

$ curl http://localhost:5000/student/3
{"age":18,"class":"2","id":3,"name":"\u738b\u4e94","profile":"\u7231\u7f16\u7a0b"}

以字段名做參數(shù),相當(dāng)于查詢條件,例如,查詢 name 為 Tom 的學(xué)生記錄:

$ curl http://localhost:5000/student/?name=Tom{"resources":
[{"age":19,"class":"1","id":7,"name":"Tom","profile":"Handsome"}]}

查詢條件可以被組合,例如,查詢班級(jí)為 1 年齡為 18 的學(xué)生:

$ curl http://localhost:5000/student/?class=1&age=19{"resources":
[{"age":19,"class":"1","id":2,"name":"\u674e\u56db","profile":"\u559c\u6b22\u7bee\u7403"},{"age":19,"class":"1","id":7,"name":"Tom","profile":"Handsome"}]}

修改

POST 方法用于新增,新增內(nèi)容,由請(qǐng)求的數(shù)據(jù)部分提供,例如增加一個(gè)學(xué)生信息:

$ curl -X POST -d '{"name": "Lily", "age": 17, "class":1, "profile":"Likely"}' -H "Content-Type:
application/json" http://127.0.0.1:5000/student/{"age":17,"class":"1","id":8,"name":"Lily","profile":"Likely"}

注意:庫表主鍵是自增長的,可以忽略主鍵字段,否則必須提供

PATCH 方法用于更新,更新內(nèi)容,由請(qǐng)求的數(shù)據(jù)部分提供,例如將 id 為 1 的學(xué)生班級(jí)更改為 3

注意: 更新時(shí)主鍵信息通過 url 的主鍵值節(jié)段提供,而不在數(shù)據(jù)部分中

$ curl -X PATCH -d '{"class":3}' -H "Content-Type:
application/json" http://127.0.0.1:5000/student/1{"age":18,"class":"3","id":1,"name":"\u5f20\u4e09","profile":"\u64c5\u957f\u5b66\u4e60"}

DELETE 方法由于刪除,例如刪除 id 為 8 的學(xué)生記錄:

$ curl -X DELETE -H "Content-Type: application/json" http://127.0.0.1:5000/student/8

其他接口

獲取表的字段定義信息,通過 meta 節(jié)段獲取,例如獲取 學(xué)生表 student的字段定義:

$ curl http://127.0.0.1:5000/student/meta
{"age":"INTEGER(11)","class":"VARCHAR(255)","id":"INTEGER(11) (required)","name":"VARCHAR(255)","profile":"VARCHAR(500)"}

導(dǎo)出數(shù)據(jù),通過查詢字段 export 獲取,數(shù)據(jù)格式為 csv,例如導(dǎo)出學(xué)生數(shù)據(jù),存放到 student.csv 文件中:

$ curl -o student.csv http://127.0.0.1:5000/student/?export
% Total    % Received % Xferd  Average Speed
Time    Time     Time  Current                                 Dload  Upload   Total   Spent    Left  Speed100   202  100   202    0     0   2525      0 --:--:-- --:--:-- --:--:--  2525

還有更多的接口有待你的探索

部署服務(wù)

sandman2 的服務(wù)器是基于 Flask 的,具體可以去官網(wǎng)參考,在此就不贅述了。

總結(jié)

sandman2 之所以簡單易用,是因組合了很多應(yīng)用和技術(shù),SQLAlchemyORM 層,FlaskRESTful 服務(wù)器,Bootstrap 做前臺(tái)框架等

給我們提供便利的同時(shí),展示了技術(shù)組合的強(qiáng)大,使得我們對(duì)一些細(xì)小知識(shí)點(diǎn)的學(xué)習(xí)不會(huì)再感到枯燥無味

文章來源:公眾號(hào)--Python技術(shù) 作者:派森醬

以上就是W3Cschool編程獅關(guān)于無需代碼,使用API操作數(shù)據(jù)庫的相關(guān)介紹了,希望對(duì)大家有所幫助。

0 人點(diǎn)贊