前言
對(duì)于編程人員來(lái)說(shuō),數(shù)據(jù)庫(kù)是必須要接觸的,但操作起來(lái)卻一點(diǎn)都不簡(jiǎn)單,要用到好幾種管理工具,好幾種連接方式。假如有一個(gè)工具能適用各種數(shù)據(jù)庫(kù),讓我們節(jié)省大量工作,那該多好。歷盡千辛萬(wàn)苦,我總算找到了這么個(gè)工具,不僅支持多種數(shù)據(jù)庫(kù),更厲害的是,不用為適配寫(xiě)一行代碼,來(lái)了解下吧。
神器出場(chǎng)
今天的主角是 sandman2
可以基于已存在的數(shù)據(jù)庫(kù),自動(dòng)生成一個(gè) RESTful API
服務(wù)器,而不需要寫(xiě)任何代碼,用作者的話說(shuō),簡(jiǎn)單地就像給食物加點(diǎn)鹽
更厲害的是,從簡(jiǎn)單地 SQLite
數(shù)據(jù)庫(kù),到大型的商業(yè)數(shù)據(jù) PostgreSQL
, 都能完美支持,且不用寫(xiě)一行代碼
目前支持的數(shù)據(jù)庫(kù):
- MySQL
- PostgreSQL
- Oracle
- Microsoft SQL Server
- SQLite
- Sybase
- Drizzle
- Firebird
這讓我想起了曾經(jīng)因?yàn)檎也坏胶线m的數(shù)據(jù)庫(kù)框架手忙腳亂的日子,如果早點(diǎn)知道 sandman2 就好了
之所以叫 sandman2,是因?yàn)樗那拜吺?sandman,sandman 已經(jīng)有了很強(qiáng)的數(shù)據(jù)庫(kù)支持能力,不過(guò)在 SQLAlchemy 0.9 版本中,增加了 automap
功能,可以進(jìn)一步使 sandman 得到簡(jiǎn)化,于是重寫(xiě)了 sandman,就有了 sandman2,并且 sandman2 的功能遠(yuǎn)超 sandman
使用 pip 安裝 pip install sandman2
安裝成功后,就可以得到一個(gè) sandman2ctl
命令行工具,用它來(lái)啟動(dòng)一個(gè) RESTful API 服務(wù)器
不用寫(xiě)一行代碼,直接啟動(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,訪問(wèn)地址是 http://localhost:5000/admin
就能看到服務(wù)器控制臺(tái)了
數(shù)據(jù)庫(kù)連接
前面已經(jīng)看到連接 SQLite
數(shù)據(jù)的方法
sandman2 是基于 SQLAlchemy
的,所以使用連接 Url 來(lái)連接數(shù)據(jù)庫(kù)
格式為
dialect+driver://username:password@host:port/database
- dialect 為數(shù)據(jù)庫(kù)類型,如 mysql、SQLite 等
- driver 為數(shù)據(jù)庫(kù)驅(qū)動(dòng)模塊名,例如 pymysql、psycopg2、mysqldb 等,如果忽略,表示使用默認(rèn)驅(qū)動(dòng)
以 mysql 數(shù)據(jù)庫(kù)為例:
sandman2ctl 'mysql+pymysql://bob:bobpasswd@localhost:3306/testdb'
如果環(huán)境中沒(méi)有安裝
pymysql
模塊,必須先安裝,才能正常啟動(dòng)
其他數(shù)據(jù)庫(kù)的連接方式可參考 SQLAlchemy 的 引擎配置
章節(jié), 在這里查看 docs.sqlalchemy.org/en/13/core/engines.html
控制臺(tái)
需要快速預(yù)覽數(shù)據(jù),對(duì)數(shù)據(jù)進(jìn)行簡(jiǎn)單調(diào)整的話,控制臺(tái)很有用
左側(cè)菜單除了 Home 外,其他的都是庫(kù)表名稱
點(diǎn)擊相應(yīng)庫(kù)表名稱,會(huì)在右側(cè)顯示表內(nèi)數(shù)據(jù),并且可以做增刪改操作
點(diǎn)擊新增,打開(kāi)新增頁(yè)面:
用過(guò) Django 的同學(xué)會(huì)感覺(jué)很熟悉,不過(guò)字段并沒(méi)有類型支持,只能以字符串輸入,自行確保數(shù)據(jù)類型正確,否則保存時(shí)會(huì)收到錯(cuò)誤信息
點(diǎn)擊記錄前面的筆狀圖標(biāo),會(huì)進(jìn)入編輯頁(yè)面
點(diǎn)擊記錄前的刪除圖標(biāo),來(lái)刪除記錄
另外多選數(shù)據(jù)后,可以通過(guò) With selected
菜單下的 Delete
按鈕來(lái)批量刪除
控制臺(tái)方便易用,適合一些簡(jiǎn)單的、數(shù)據(jù)量少的操作
注意:由于控制臺(tái)不能登錄即可訪問(wèn),建議將服務(wù)器創(chuàng)建在本地或內(nèi)網(wǎng)環(huán)境中
API
以 RESTful 的角度來(lái)看,庫(kù)表相當(dāng)于資源
(resource
),一組資源相當(dāng)于集合
(collection
)
以下測(cè)驗(yàn),均采用
curl
工具進(jìn)行,具體用法可參考 阮一峰的 《curl 的用法指南》(www.ruanyifeng.com/blog/2019/09/curl-reference.html)
查詢
通過(guò) 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é)尾
通過(guò)參數(shù) page
來(lái)分頁(yè),例如返回 學(xué)生表 student
的第一頁(yè)數(shù)據(jù)
$ curl http://localhost:5000/student/?page=1
{"resources":[{"age":18,"class":"1"...
通過(guò)參數(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"}
注意:庫(kù)表主鍵是自增長(zhǎng)的,可以忽略主鍵字段,否則必須提供
PATCH
方法用于更新,更新內(nèi)容,由請(qǐng)求的數(shù)據(jù)部分提供,例如將 id 為 1 的學(xué)生班級(jí)更改為 3
注意: 更新時(shí)主鍵信息通過(guò) 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
其他接口
獲取表的字段定義信息,通過(guò) 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ù),通過(guò)查詢字段 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
之所以簡(jiǎn)單易用,是因組合了很多應(yīng)用和技術(shù),SQLAlchemy
做 ORM
層,Flask
做 RESTful
服務(wù)器,Bootstrap
做前臺(tái)框架等
給我們提供便利的同時(shí),展示了技術(shù)組合的強(qiáng)大,使得我們對(duì)一些細(xì)小知識(shí)點(diǎn)的學(xué)習(xí)不會(huì)再感到枯燥無(wú)味
文章來(lái)源:公眾號(hào)--Python技術(shù) 作者:派森醬
以上就是W3Cschool編程獅
關(guān)于無(wú)需代碼,使用API操作數(shù)據(jù)庫(kù)的相關(guān)介紹了,希望對(duì)大家有所幫助。