教你使用Psycopg2連接openGauss的方法
1.簡(jiǎn)介
Psycopg是一種用于執(zhí)行SQL語(yǔ)句的PythonAPI,可以為PostgreSQL、openGauss數(shù)據(jù)庫(kù)提供統(tǒng)一訪(fǎng)問(wèn)接口,應(yīng)用程序可基于它進(jìn)行數(shù)據(jù)操作。Psycopg2是對(duì)libpq的封裝,主要使用C語(yǔ)言實(shí)現(xiàn),既高效又安全。它具有客戶(hù)端游標(biāo)和服務(wù)器端游標(biāo)、異步通信和通知、支持“COPY TO/COPY FROM”功能。支持多種類(lèi)型Python開(kāi)箱即用,適配PostgreSQL數(shù)據(jù)類(lèi)型;通過(guò)靈活的對(duì)象適配系統(tǒng),可以擴(kuò)展和定制適配。Psycopg2兼容Unicode和Python 3。
openGauss數(shù)據(jù)庫(kù)提供了對(duì)Psycopg2特性的支持,并且支持Psycopg2通過(guò)SSL模式鏈接。
2.接口介紹
開(kāi)發(fā)流程

接口說(shuō)明
openGauss提供了如下接口供開(kāi)發(fā)者使用:
- psycopg2.connect()
此方法創(chuàng)建新的數(shù)據(jù)庫(kù)會(huì)話(huà)并返回新的connection對(duì)象(連接openGauss數(shù)據(jù)庫(kù)實(shí)例的對(duì)象)。
conn=psycopg2.connect(dbname=“test”,user=“postgres”,password=“secret”,host=“127.0.0.1”,port=“5432”)
或者
conn = psycopg2.connect(“dbname=test user=postgres password=secret
host=127.0.0.1 port=5432”)
創(chuàng)建連接對(duì)象(SSl連接)
conn = psycopg2.connect(dbname=“postgres”, user=“user”, password=“password”, host=“localhost”, port=port, sslmode=“verify-ca”, sslcert=“client.crt”, sslkey=“client.key”, sslrootcert=“cacert.pem”)
注意: 如果sslcert, sslkey,sslrootcert沒(méi)有填寫(xiě),默認(rèn)取當(dāng)前用戶(hù).postgresql目錄下對(duì)應(yīng)的client.crt, client.key, root.crt
- connection.cursor()
此方法用于返回新的cursor對(duì)象(用于整個(gè)數(shù)據(jù)庫(kù)使用Python編程的cursor)。
cursor(name=None, cursor_factory=None, scrollable=None,
withhold=False)
- cursor.execute(query,vars_list)
此方法執(zhí)行被參數(shù)化的SQL語(yǔ)句(即占位符,而不是SQL文字)。psycopg2模塊支持用%s標(biāo)志的占位符。
curosr.execute(query,vars_list)
- curosr.executemany(query,vars_list)
此方法執(zhí)行SQL命令所有參數(shù)序列或序列中的SQL映射。
curosr.executemany(query,vars_list)
- connection.commit()
此方法將當(dāng)前掛起的事務(wù)提交到數(shù)據(jù)庫(kù)。默認(rèn)情況下,Psycopg在執(zhí)行第一個(gè)命令之前打開(kāi)一個(gè)事務(wù):如果不調(diào)用commit(),任何數(shù)據(jù)操作的效果都將丟失。
connection.commit()
- connection.rollback()
此方法回滾當(dāng)前掛起事務(wù)。執(zhí)行關(guān)閉連接“close()”而不先提交更改“commit()”將導(dǎo)致執(zhí)行隱式回滾。
connection.rollback()
- cursor.fetchone()
此方法提取查詢(xún)結(jié)果集的下一行,并返回一個(gè)元組。返回單個(gè)元組,為結(jié)果集的第一條結(jié)果,當(dāng)沒(méi)有更多數(shù)據(jù)可用時(shí),返回為“None”。
cursor.fetchone()
- cursor.fetchall()
此方法獲取查詢(xún)結(jié)果的所有(剩余)行,并將它們作為元組列表返回。返回元組列表,為結(jié)果集的所有結(jié)果??招袝r(shí)則返回空列表。
cursor.fetchall()
- cursor.close()
此方法關(guān)閉當(dāng)前連接的游標(biāo)。
cursor.close()
- connection.close()
此方法關(guān)閉數(shù)據(jù)庫(kù)連接。此方法關(guān)閉數(shù)據(jù)庫(kù)連接,并不自動(dòng)調(diào)用commit()。如果只是關(guān)閉數(shù)據(jù)庫(kù)連接而不調(diào)用commit()方法,那么所有更改將會(huì)丟失。
connection.close()
3.使用
3.1環(huán)境準(zhǔn)備
本篇使用環(huán)境信息:
- 華為云HECS 2核4G
- CentOS Linux release 7.6
- Python 3.6.8
- openGauss 3.1.0 極簡(jiǎn)版
3.2下載并加載python驅(qū)動(dòng)
1、可以在openGauss官網(wǎng)下載后用FTP工具比如winscp等上傳到服務(wù)器,也可以直接在服務(wù)器上用wget方式獲取,根據(jù)操作系統(tǒng)版本下載對(duì)應(yīng)的驅(qū)動(dòng)。

root用戶(hù)下新建存放目錄,執(zhí)行wget和解壓命令。
mkdir psycopg2 wget https://opengauss.obs.cn-south-1.myhuaweicloud.com/3.1.0/x86/openGauss-3.1.0-CentOS-x86_64-Python.tar.gz tar -zxvf openGauss-3.1.0-CentOS-x86_64-Python.tar.gz

解壓后有兩個(gè)文件夾 lib和psycopg2,分別放置對(duì)應(yīng)的庫(kù)文件。
2、在解壓后的路徑下執(zhí)行拷貝命令,將驅(qū)動(dòng)拷貝到python3下的site-packages目錄
cp -r psycopg2/ /usr/lib/python3.6/site-packages/
3、修改psycopg2/目錄權(quán)限為755
cd /usr/lib/python3.6/site-packages/ chmod 755 psycopg2/
4、對(duì)于非數(shù)據(jù)庫(kù)用戶(hù),需要將解壓后的lib目錄,配置在LD_LIBRARY_PATH中。
export $LD_LIBRARY_PATH=$LD_LIBRARY_PATH:/path/to/psycopg2/lib/ ldconfig
3.3創(chuàng)建數(shù)據(jù)庫(kù)連接用戶(hù)
注意,由于psycopg2只能使用MD5方式連接,而openGauss默認(rèn)安裝時(shí)使用sha256加密,所以這里需要修改一下配置。
修改 data/single_node/postgresql.conf 中password_encryption_type = 1 ,表示支持md5和sha256。
修改pg_hba.conf 中加密算法

然后重啟openGauss:gs_ctl restart -D /opt/software/openGauss/data/single_node
連接到openGauss創(chuàng)建用戶(hù)和數(shù)據(jù)庫(kù)。
create database mydb; CREATE USER tuser WITH PASSWORD '自己定義'; GRANT ALL PRIVILEGES TO tuser; alter database mydb owner to tuser;
如果在修改加密方式前之前已經(jīng)創(chuàng)建過(guò)用戶(hù)了,需要在配置文件修改及數(shù)據(jù)庫(kù)重啟完成后,重新建用戶(hù)或者設(shè)置用戶(hù)密碼。
3.4示例
編寫(xiě)python文件
vi ogconn.py
將如下測(cè)試語(yǔ)句拷貝進(jìn)去,根據(jù)實(shí)際情況修改對(duì)應(yīng)的openGauss數(shù)據(jù)庫(kù)連接信息。
import psycopg2
conn=psycopg2.connect(database="mydb",user="tuser",password="XXXXXXX",host="127.0.0.1",port=5432)
#或者用下面的也可以
#conn = psycopg2.connect("dbname=mydb user=tuser password=password host=localhost port=port")
print("Conn openGauss successfully")
cur=conn.cursor()
cur.execute("DROP TABLE IF EXISTS student")
cur.execute("CREATE TABLE student(id integer,name varchar,sex varchar);")
cur.execute("INSERT INTO student(id,name,sex) VALUES(%s,%s,%s)",(1,'Bob','M'))
cur.execute("INSERT INTO student(id,name,sex) VALUES(%s,%s,%s)",(2,'Kevin','M'))
cur.execute('SELECT id,name,sex FROM student')
results=cur.fetchall()
print (results)
conn.commit()
cur.close()
conn.close()連接測(cè)試
python3 ogconn.py
報(bào)錯(cuò)了,psycopg2.OperationalError: SCRAM authentication requires libpq version 10 or above
解決辦法:
根據(jù)提示升級(jí)版本
rpm -Uvh https://download.postgresql.org/pub/repos/yum/reporpms/EL-7-x86_64/pgdg-redhat-repo-latest.noarch.rpm yum install postgresql10-devel
根據(jù)提示輸入y,等提示Complete!
重新測(cè)試連接

注意,如果使用本地工具連接遠(yuǎn)端云服務(wù)器的數(shù)據(jù)庫(kù)時(shí),需要修改云服務(wù)器安全組,將openGauss的端口放開(kāi),否則會(huì)連接不上。
4.常見(jiàn)報(bào)錯(cuò)
執(zhí)行python3 ogconn.py報(bào)錯(cuò)
1.提示如下錯(cuò)誤
File “/opt/software/psycopg2/psycopg2/init.py”, line 122, in connect
conn = _connect(dsn, connection_factory=connection_factory, **kwasync)
psycopg2.OperationalError: SCRAM authentication requires libpq version 10 or above
這個(gè)錯(cuò)是說(shuō)libpq版本應(yīng)該在10以上,需要升級(jí)下版本。
解決辦法:
rpm -Uvh https://download.postgresql.org/pub/repos/yum/reporpms/EL-7-x86_64/pgdg-redhat-repo-latest.noarch.rpm yum install postgresql10-devel
根據(jù)提示輸入y,等提示Complete!
2.提示如下錯(cuò)誤:
psycopg2.OperationalError: none of the server’s SASL authentication mechanisms are supported
這個(gè)就是加密方式的問(wèn)題,參考文章中“創(chuàng)建數(shù)據(jù)庫(kù)連接用戶(hù)”部分解決。
到此這篇關(guān)于教你使用Psycopg2連接openGauss的方法的文章就介紹到這了,更多相關(guān)Psycopg2連接openGauss內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
Python腳本實(shí)現(xiàn)12306火車(chē)票查詢(xún)系統(tǒng)
本文給大家分享我使用python3實(shí)現(xiàn)的12306火車(chē)票查詢(xún)系統(tǒng),小編分步驟給大家介紹的非常詳細(xì),感興趣的朋友一起看看吧2016-09-09
python cv2截取不規(guī)則區(qū)域圖片實(shí)例
今天小編就為大家分享一篇python cv2截取不規(guī)則區(qū)域圖片實(shí)例,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過(guò)來(lái)看看吧2019-12-12
在Python中使用Neo4j數(shù)據(jù)庫(kù)的教程
這篇文章主要介紹了在Python中使用Neo4j數(shù)據(jù)庫(kù)的教程,Neo4j是一個(gè)具有一定人氣的非關(guān)系型的數(shù)據(jù)庫(kù),需要的朋友可以參考下2015-04-04
Python Django 頁(yè)面上展示固定的頁(yè)碼數(shù)實(shí)現(xiàn)代碼
這篇文章主要介紹了Python Django 頁(yè)面上展示固定的頁(yè)碼數(shù)實(shí)現(xiàn)代碼,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友可以參考下2019-08-08
在pytorch中為Module和Tensor指定GPU的例子
今天小編就為大家分享一篇在pytorch中為Module和Tensor指定GPU的例子,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過(guò)來(lái)看看吧2019-08-08
Python 3.6 中使用pdfminer解析pdf文件的實(shí)現(xiàn)
這篇文章主要介紹了Python 3.6 中使用pdfminer解析pdf文件的實(shí)現(xiàn),文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧2019-09-09
使用python進(jìn)行廣告點(diǎn)擊率的預(yù)測(cè)的實(shí)現(xiàn)
這篇文章主要介紹了使用python進(jìn)行廣告點(diǎn)擊率的預(yù)測(cè)的實(shí)現(xiàn),文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧2019-07-07
python xlwt如何設(shè)置單元格的自定義背景顏色
這篇文章主要介紹了python xlwt如何設(shè)置單元格的自定義背景顏色,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友可以參考下2019-09-09

