不用一行代码,用 API 操作数据库,你信吗
文 |?太陽雪
來源:Python 技術(shù)「ID: pythonall」
數(shù)據(jù)庫(kù)的重要性不言而喻,但是數(shù)據(jù)庫(kù)操作起來卻不容易,需要用到各種管理工具,各種不同的連接方式,如果有方便的,屏蔽不同數(shù)據(jù)庫(kù)細(xì)節(jié)的工具該多好,功夫不負(fù)有心人,我還真找了這樣一個(gè)工具,不僅支持多種數(shù)據(jù)庫(kù),更厲害的是,不用為適配寫一行代碼,來了解下吧
神器出場(chǎng)
今天的主角是 sandman2
可以基于已存在的數(shù)據(jù)庫(kù),自動(dòng)生成一個(gè) RESTful API 服務(wù)器,而不需要寫任何代碼,用作者的話說,簡(jiǎn)單地就像給食物加點(diǎn)鹽
更厲害的是,從簡(jiǎn)單地 SQLite 數(shù)據(jù)庫(kù),到大型的商業(yè)數(shù)據(jù) PostgreSQL, 都能完美支持,且不用寫一行代碼
目前支持的數(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ù)支持能力,不過在 SQLAlchemy 0.9 版本中,增加了 automap 功能,可以進(jìn)一步使 sandman 得到簡(jiǎn)化,于是重寫了 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)了
數(shù)據(jù)庫(kù)連接
前面已經(jīng)看到連接 SQLite 數(shù)據(jù)的方法
sandman2 是基于 SQLAlchemy 的,所以使用連接 Url 來連接數(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)境中沒有安裝 pymysql 模塊,必須先安裝,才能正常啟動(dòng)
其他數(shù)據(jù)庫(kù)的連接方式可參考 SQLAlchemy 的 引擎配置 章節(jié), 在這里查看 https://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ù),并且可以做增刪改操作
庫(kù)表數(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)方便易用,適合一些簡(jiǎn)單的、數(shù)據(jù)量少的操作
注意:由于控制臺(tái)不能登錄即可訪問,建議將服務(wù)器創(chuàng)建在本地或內(nèi)網(wǎng)環(huán)境中
API
以 RESTful 的角度來看,庫(kù)表相當(dāng)于資源(resource),一組資源相當(dāng)于集合(collection)
以下測(cè)驗(yàn),均采用 curl 工具進(jìn)行,具體用法可參考 阮一峰的 《curl 的用法指南》(http://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"}注意:庫(kù)表主鍵是自增長(zhǎng)的,可以忽略主鍵字段,否則必須提供
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 CurrentDload Upload Total Spent Left Speed 100 202 100 202 0 0 2525 0 --:--:-- --:--:-- --:--:-- 2525還有更多的接口有待你的探索
部署服務(wù)
sandman2 的服務(wù)器是基于 Flask 的
前面的 Python 100 天文章中對(duì) Flask 和 服務(wù)器部署有詳細(xì)的說明
具體可參考,《Web 開發(fā) Flask 簡(jiǎn)介》,以及《部署 Flask 應(yī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ì)再感到枯燥無味
參考
https://www.cnblogs.com/Liu-Hui/p/13388194.html
https://sandman2.readthedocs.io/en/latest/
http://www.ruanyifeng.com/blog/2019/09/curl-reference.html
由于微信平臺(tái)算法改版,公號(hào)內(nèi)容將不再以時(shí)間排序展示,如果大家想第一時(shí)間看到我們的推送,強(qiáng)烈建議星標(biāo)我們和給我們多點(diǎn)點(diǎn)【在看】。星標(biāo)具體步驟為:
總結(jié)
以上是生活随笔為你收集整理的不用一行代码,用 API 操作数据库,你信吗的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 作为程序员,你吃过哪些数学的亏?
- 下一篇: 都说雪花ID不能做MySQL的主键,你确