日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當(dāng)前位置: 首頁 > 运维知识 > 数据库 >内容正文

数据库

不用一行代码,用 API 操作数据库,你信吗

發(fā)布時(shí)間:2024/9/15 数据库 32 豆豆
生活随笔 收集整理的這篇文章主要介紹了 不用一行代码,用 API 操作数据库,你信吗 小編覺得挺不錯(cuò)的,現(xiàn)在分享給大家,幫大家做個(gè)參考.

文 |?太陽雪

來源: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)具體步驟為:

(1)點(diǎn)擊頁面最上方“小詹學(xué)Python”,進(jìn)入公眾號(hào)主頁。 (2)點(diǎn)擊右上角的小點(diǎn)點(diǎn),在彈出頁面點(diǎn)擊“設(shè)為星標(biāo)”,就可以啦。 感謝支持,比心。

總結(jié)

以上是生活随笔為你收集整理的不用一行代码,用 API 操作数据库,你信吗的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網(wǎng)站內(nèi)容還不錯(cuò),歡迎將生活随笔推薦給好友。