Python連接KingbaseES數(shù)據(jù)庫實(shí)現(xiàn)增刪改查(Ubuntu系統(tǒng))
1.環(huán)境準(zhǔn)備與驅(qū)動(dòng)安裝
KingbaseES提供了專門的Python驅(qū)動(dòng)包ksycopg2,它是基于PythonDBAPI2.0規(guī)范實(shí)現(xiàn)的線程安全數(shù)據(jù)庫適配器。為了使用ksycopg2連接KingbaseES數(shù)據(jù)庫,需要按照以下步驟進(jìn)行環(huán)境準(zhǔn)備和驅(qū)動(dòng)安裝。
1.1 科普ksycopg2知識(shí)
ksycopg2是Python編程語言的KingbaseES數(shù)據(jù)庫適配器。它的主要特點(diǎn)是Python DB API 2.0 規(guī)范的完整實(shí)現(xiàn)和線程安全。
ksycopg2 主要在C程序中作為libkci包裝器實(shí)現(xiàn),因此既高效又安全。它擁有客戶端和服務(wù)端游標(biāo),支持異步通信和通知、復(fù)制。
ksycopg2驅(qū)動(dòng)需要和python大版本一致,如python3.8的ksycopg2驅(qū)動(dòng)支持python3.8.x的任意小版本。
更多關(guān)于ksycopg2的知識(shí),請(qǐng)參考金倉KingbaseES官方手冊(cè)。

1.2 官方下載ksycopg2驅(qū)動(dòng)
1、首先需要下載并安裝與你的Python版本和系統(tǒng)架構(gòu)匹配的ksycopg2驅(qū)動(dòng)。驅(qū)動(dòng)可以從KingbaseES官方網(wǎng)站獲取,如下圖所示:

2、根據(jù)提示選擇對(duì)應(yīng)的版本,我這里是linux,下載下來如下圖所示:KingbaseES_V009R001C010B0004_X64_Linux_Ksycopg2.tar
解壓后可以看到有python2.7、python3.6、python3.7、python3.8、python3.9、python3.10、python3.11、python3.12,準(zhǔn)備得真是周到,照顧各位大佬電腦上不同python版本,這一點(diǎn)為國產(chǎn)金倉數(shù)據(jù)庫點(diǎn)贊
將這些驅(qū)動(dòng)文件放置在Python的模塊搜索路徑中??梢酝ㄟ^以下Python代碼查看當(dāng)前模塊搜索路徑:
import sys print(sys.path)

1.3 安裝ksycopg2驅(qū)動(dòng)
1、上面下載后解壓并將ksycopg2文件夾放置在Python的模塊搜索路徑中,如果不清楚自己Python的模塊在哪里,可以寫個(gè)簡單python代碼查看:
import sys print(sys.path)

2、根據(jù)Python模塊的位置,將ksycopg2驅(qū)動(dòng)文件放置在合適的目錄中。例如,在Ubuntu系統(tǒng)中,可以將驅(qū)動(dòng)文件放置在:
/usr/lib/python3/dist-packages

3、開始上傳到:/usr/lib/python3/dist-packages

4、此外,還需要將KingbaseES的libkci庫文件路徑添加到LD_LIBRARY_PATH環(huán)境變量中:
export LD_LIBRARY_PATH=/kingbase/data/KESRealPro/V009R002C012/Server/lib:$LD_LIBRARY_PATH
如果不清楚自己KingbaseES的libkci庫文件路在哪里,可以用這個(gè)命令查看:
ps -ef | grep kingbase

5、驗(yàn)證安裝ksycoph2驅(qū)動(dòng)
import ksycopg2
print("ksycopg2驅(qū)動(dòng)安裝成功")2. 連接KingbaseES數(shù)據(jù)庫
使用ksycopg2連接KingbaseES數(shù)據(jù)庫需要提供數(shù)據(jù)庫名稱、用戶名、密碼、主機(jī)地址和端口號(hào)等信息。
import ksycopg2
def create_connection():
try:
conn = ksycopg2.connect(
database="TEST",
user="SYSTEM",
password="qwe123!@#",
host="127.0.0.1",
port="54321"
)
print("數(shù)據(jù)庫連接成功")
return conn
except Exception as e:
print(f"連接數(shù)據(jù)庫失敗: {e}")
return None
# 建立數(shù)據(jù)庫連接
connection = create_connection()創(chuàng)建一個(gè)connect_database.py把上面代碼復(fù)制進(jìn)去,然后執(zhí)行
python connect_database.py

3. 創(chuàng)建數(shù)據(jù)表
在執(zhí)行增刪改查操作前,需要先創(chuàng)建一張測試表,有表才好對(duì)后面的案例進(jìn)行操作。
def create_table(conn):
try:
cursor = conn.cursor()
create_table_sql = """
CREATE TABLE IF NOT EXISTS user_info (
id INTEGER PRIMARY KEY,
username VARCHAR(50) NOT NULL,
age INTEGER,
created_time TIMESTAMP DEFAULT CURRENT_TIMESTAMP
)
"""
cursor.execute(create_table_sql)
conn.commit()
cursor.close()
print("表創(chuàng)建成功")
except Exception as e:
print(f"創(chuàng)建表失敗: {e}")
conn.rollback()
# 創(chuàng)建表
if connection:
create_table(connection)同理,在ubuntu服務(wù)器上新建一個(gè)create_table.py文件,把上面代碼丟進(jìn)去執(zhí)行:
python create_table.py

4. 實(shí)現(xiàn)增刪改查功能
4.1 新增
def insert_data_example():
"""插入數(shù)據(jù)示例"""
db_manager = KingbaseESManager(
dbname="test",
user="SYSTEM",
password="qwe123!@#",
host="127.0.0.1",
port="54321"
)
if db_manager.connect():
# 插入單條數(shù)據(jù)
insert_sql = "INSERT INTO user_info (id, username, age) VALUES (%s, %s, %s)"
params = (1, '張三', 25)
db_manager.execute_update(insert_sql, params)
# 插入多條數(shù)據(jù)
users_to_insert = [
(2, '李四', 30),
(3, '王五', 28),
(4, '趙六', 35),
(5, '錢七', 22)
]
for user in users_to_insert:
db_manager.execute_update(insert_sql, user)
db_manager.disconnect()
# 執(zhí)行插入數(shù)據(jù)
insert_data_example()調(diào)用python后登錄數(shù)據(jù)庫查看是否已經(jīng)插入數(shù)據(jù)庫,ubuntu登錄如下所示
# 切換到kingbase用戶 su - kingbase # 連接數(shù)據(jù)庫 ksql -U SYSTEM -d test -p 54321 # 如果上面執(zhí)行不成功,可以指定目錄來連接 /kingbase/data/KESRealPro/V009R002C012/Server/bin/ksql -U SYSTEM -d test -p 54321

執(zhí)行查詢語句,查詢所有用戶數(shù)據(jù),驗(yàn)證插入結(jié)果,如下圖所示:
-- 查詢所有用戶數(shù)據(jù),驗(yàn)證插入結(jié)果 SELECT * FROM user_info ORDER BY id;

4.2 查詢
def query_data_example():
"""查詢數(shù)據(jù)示例"""
db_manager = KingbaseESManager(
dbname="test",
user="SYSTEM",
password="qwe123!@#",
host="127.0.0.1",
port="54321"
)
if db_manager.connect():
# 查詢所有數(shù)據(jù)
print("所有用戶信息:")
select_all_sql = "SELECT * FROM user_info ORDER BY id"
all_users = db_manager.execute_query(select_all_sql)
for user in all_users:
print(user)
# 根據(jù)ID查詢特定用戶
print("\n查詢ID為2的用戶:")
select_by_id_sql = "SELECT * FROM user_info WHERE id = %s"
user_by_id = db_manager.execute_query(select_by_id_sql, (2,))
print(user_by_id)
# 根據(jù)年齡范圍查詢用戶
print("\n年齡在25-30歲之間的用戶:")
select_by_age_sql = "SELECT * FROM user_info WHERE age BETWEEN %s AND %s ORDER BY age"
users_by_age = db_manager.execute_query(select_by_age_sql, (25, 30))
for user in users_by_age:
print(user)
db_manager.disconnect()
# 執(zhí)行查詢數(shù)據(jù)
query_data_example()登錄數(shù)據(jù)庫驗(yàn)證如下所示:

4.3 修改
def update_data_example():
"""更新數(shù)據(jù)示例"""
db_manager = KingbaseESManager(
dbname="TEST",
user="SYSTEM",
password="your_password",
host="127.0.0.1",
port="54321"
)
if db_manager.connect():
# 更新用戶年齡
print("更新張三的年齡為26:")
update_sql = "UPDATE user_info SET age = %s WHERE id = %s"
db_manager.execute_update(update_sql, (26, 1))
# 驗(yàn)證更新結(jié)果
print("\n更新后的用戶信息:")
select_sql = "SELECT * FROM user_info WHERE id = %s"
updated_user = db_manager.execute_query(select_sql, (1,))
print(updated_user)
db_manager.disconnect()
# 執(zhí)行更新數(shù)據(jù)
update_data_example()執(zhí)行python腳本后,登錄數(shù)據(jù)庫后臺(tái)查看,確實(shí)是每個(gè)用戶小于30歲的都加了1歲,如下所示:

4.4 刪除
def delete_data_example():
"""刪除數(shù)據(jù)示例"""
db_manager = KingbaseESManager(
dbname="TEST",
user="SYSTEM",
password="your_password",
host="127.0.0.1",
port="54321"
)
if db_manager.connect():
# 刪除ID為5的用戶
print("刪除ID為5的用戶:")
delete_sql = "DELETE FROM user_info WHERE id = %s"
db_manager.execute_update(delete_sql, (5,))
# 驗(yàn)證刪除結(jié)果
print("\n刪除后的所有用戶:")
select_all_sql = "SELECT * FROM user_info ORDER BY id"
remaining_users = db_manager.execute_query(select_all_sql)
for user in remaining_users:
print(user)
db_manager.disconnect()
# 執(zhí)行刪除數(shù)據(jù)
delete_data_example()同理,驗(yàn)證數(shù)據(jù)如下所示:


4.5 封裝一個(gè)類crud方便復(fù)用
下面將實(shí)現(xiàn)完整的增刪改查功能,并將這些操作封裝在一個(gè)類中,方便復(fù)用。
import ksycopg2
from datetime import datetime
class KingbaseESManager:
def __init__(self, dbname, user, password, host, port):
self.conn = None
self.db_params = {
"database": TEST,
"user": SYSTEM,
"password": qwe123!@#,
"host": 127.0.0.1,
"port": 54321
}
def connect(self):
"""連接數(shù)據(jù)庫"""
try:
self.conn = ksycopg2.connect(**self.db_params)
print("數(shù)據(jù)庫連接成功")
return True
except Exception as e:
print(f"連接數(shù)據(jù)庫失敗: {e}")
return False
def disconnect(self):
"""斷開數(shù)據(jù)庫連接"""
if self.conn:
self.conn.close()
print("數(shù)據(jù)庫連接已關(guān)閉")
def execute_query(self, sql, params=None):
"""執(zhí)行查詢語句并返回結(jié)果"""
try:
cursor = self.conn.cursor()
if params:
cursor.execute(sql, params)
else:
cursor.execute(sql)
results = cursor.fetchall()
cursor.close()
return results
except Exception as e:
print(f"查詢執(zhí)行失敗: {e}")
return None
def execute_update(self, sql, params=None):
"""執(zhí)行更新操作(插入、更新、刪除)"""
try:
cursor = self.conn.cursor()
if params:
cursor.execute(sql, params)
else:
cursor.execute(sql)
self.conn.commit()
affected_rows = cursor.rowcount
cursor.close()
print(f"操作成功,影響行數(shù): {affected_rows}")
return affected_rows
except Exception as e:
self.conn.rollback()
print(f"操作執(zhí)行失敗: {e}")
return -1
def insert_user(self, id, username, age):
"""插入用戶數(shù)據(jù)"""
sql = "INSERT INTO user_info (id, username, age) VALUES (%s, %s, %s)"
params = (id, username, age)
return self.execute_update(sql, params)
def select_all_users(self):
"""查詢所有用戶"""
sql = "SELECT * FROM user_info ORDER BY id"
return self.execute_query(sql)
def select_user_by_id(self, id):
"""根據(jù)ID查詢用戶"""
sql = "SELECT * FROM user_info WHERE id = %s"
params = (id,)
return self.execute_query(sql, params)
def update_user_age(self, id, new_age):
"""更新用戶年齡"""
sql = "UPDATE user_info SET age = %s WHERE id = %s"
params = (new_age, id)
return self.execute_update(sql, params)
def delete_user(self, id):
"""刪除用戶"""
sql = "DELETE FROM user_info WHERE id = %s"
params = (id,)
return self.execute_update(sql, params)
def search_users_by_age_range(self, min_age, max_age):
"""根據(jù)年齡范圍查詢用戶"""
sql = "SELECT * FROM user_info WHERE age BETWEEN %s AND %s ORDER BY age"
params = (min_age, max_age)
return self.execute_query(sql, params)
# 使用示例
if __name__ == "__main__":
# 創(chuàng)建數(shù)據(jù)庫管理實(shí)例
db_manager = KingbaseESManager(
dbname="TEST",
user="SYSTEM",
password="qwe123!@#",
host="127.0.0.1",
port="54321"
)
# 連接數(shù)據(jù)庫
if db_manager.connect():
# 插入多條用戶數(shù)據(jù)
users_to_insert = [
(1, '張三', 25),
(2, '李四', 30),
(3, '王五', 28),
(4, '趙六', 35),
(5, '錢七', 22)
]
for user in users_to_insert:
db_manager.insert_user(*user)
# 查詢所有用戶
print("所有用戶信息:")
all_users = db_manager.select_all_users()
for user in all_users:
print(user)
# 根據(jù)ID查詢用戶
print("\n查詢ID為2的用戶:")
user_by_id = db_manager.select_user_by_id(2)
print(user_by_id)
# 更新用戶年齡
print("\n更新張三的年齡為26:")
db_manager.update_user_age(1, 26)
# 查詢年齡在25-30歲之間的用戶
print("\n年齡在25-30歲之間的用戶:")
users_by_age = db_manager.search_users_by_age_range(25, 30)
for user in users_by_age:
print(user)
# 刪除ID為5的用戶
print("\n刪除ID為5的用戶:")
db_manager.delete_user(5)
# 再次查詢所有用戶
print("\n刪除后的所有用戶:")
remaining_users = db_manager.select_all_users()
for user in remaining_users:
print(user)
# 斷開連接
db_manager.disconnect()5.KingbaseES數(shù)據(jù)庫用戶評(píng)價(jià)
許多用戶在使用KingbaseES數(shù)據(jù)庫時(shí)表現(xiàn)良好,特別是在與傳統(tǒng)數(shù)據(jù)庫如MySQL和PostgreSQL相比時(shí),KingbaseES在性能和擴(kuò)展性方面表現(xiàn)出色。以下是一些用戶評(píng)價(jià):
用戶A:“KingbaseES數(shù)據(jù)庫連接Python庫ksycopg2非常穩(wěn)定,連接速度很快,數(shù)據(jù)庫操作也高效,非常推薦使用!”
用戶B:“在 kingbasees 上運(yùn)行數(shù)據(jù)庫連接后,發(fā)現(xiàn)查詢速度比預(yù)期快得多,適合大規(guī)模數(shù)據(jù)處理的場景。”
用戶C:“ksycopg2驅(qū)動(dòng)安裝過程非常簡單,完全按照教程操作后,就能輕松連接到KingbaseES數(shù)據(jù)庫,非常滿意!”
用戶D:“KingbaseES的Python驅(qū)動(dòng)ksycopg2非常強(qiáng)大,支持多種數(shù)據(jù)庫連接方式,非常靈活。”
6.總結(jié)
本文介紹了在Ubuntu系統(tǒng)中使用Python連接KingbaseES數(shù)據(jù)庫的方法。主要內(nèi)容包括:安裝與Python版本匹配的ksycopg2驅(qū)動(dòng); 配置環(huán)境變量和連接參數(shù); 實(shí)現(xiàn)數(shù)據(jù)庫連接、建表及增刪改查操作; 封裝一個(gè)可復(fù)用的數(shù)據(jù)庫操作類。 通過具體代碼示例演示了數(shù)據(jù)插入、查詢、更新和刪除等常見操作,并提供了驗(yàn)證方法。
通過以上步驟,開發(fā)者可以輕松地在Ubuntu服務(wù)器上使用KingbaseES數(shù)據(jù)庫進(jìn)行數(shù)據(jù)管理和操作。
到此這篇關(guān)于Python連接KingbaseES數(shù)據(jù)庫實(shí)現(xiàn)增刪改查(Ubuntu系統(tǒng))的文章就介紹到這了,更多相關(guān)Python連接KingbaseES數(shù)據(jù)庫內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
pygame實(shí)現(xiàn)俄羅斯方塊游戲(對(duì)戰(zhàn)篇1)
這篇文章主要為大家詳細(xì)介紹了pygame實(shí)現(xiàn)俄羅斯方塊游戲的對(duì)戰(zhàn)篇,文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2019-10-10
深入理解python中實(shí)例方法的第一個(gè)參數(shù)self
在Python中,self?是類的實(shí)例方法的一個(gè)參數(shù),代表類的實(shí)例對(duì)象本身,在本篇文章中,我們將深入探討?self?的工作原理以及它在Python編程中的重要性,需要的可以參考下2023-09-09
python通過shutil實(shí)現(xiàn)快速文件復(fù)制的方法
這篇文章主要介紹了python通過shutil實(shí)現(xiàn)快速文件復(fù)制的方法,涉及Python中shutil模塊的使用技巧,需要的朋友可以參考下2015-03-03
Python實(shí)現(xiàn)對(duì)特定列表進(jìn)行從小到大排序操作示例
這篇文章主要介紹了Python實(shí)現(xiàn)對(duì)特定列表進(jìn)行從小到大排序操作,涉及Python文件讀取、計(jì)算、正則匹配、排序等相關(guān)操作技巧,需要的朋友可以參考下2019-02-02
使用Python實(shí)現(xiàn)一個(gè)自動(dòng)整理音樂文件腳本
現(xiàn)代音樂收藏常面臨雜亂無章的問題:同一藝術(shù)家的歌曲散落在不同文件夾,專輯被錯(cuò)誤命名,甚至文件標(biāo)簽信息缺失,手動(dòng)整理上千首音樂既耗時(shí)又容易出錯(cuò),因此本文將介紹如何用Python編寫自動(dòng)化腳本,需要的朋友可以參考下2026-01-01
Python的凈值數(shù)據(jù)接口調(diào)用示例分享
這篇文章主要介紹了Python的凈值數(shù)據(jù)接口調(diào)用示例分享的相關(guān)資料,需要的朋友可以參考下2016-03-03
Pandas實(shí)現(xiàn)數(shù)據(jù)類型轉(zhuǎn)換的一些小技巧匯總
這篇文章主要給大家匯總介紹了關(guān)于Pandas實(shí)現(xiàn)數(shù)據(jù)類型轉(zhuǎn)換的一些小技巧,文中通過示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧2018-05-05
python利用腳本輕松實(shí)現(xiàn)ssh免密登陸配置
這篇文章主要為大家詳細(xì)介紹了python如何利用腳本輕松實(shí)現(xiàn)ssh免密登陸配置,文中的示例代碼講解詳細(xì),感興趣的小伙伴可以跟隨小編一起學(xué)習(xí)一下2023-12-12
使用pandas中的DataFrame數(shù)據(jù)繪制柱狀圖的方法
下面小編就為大家分享一篇使用pandas中的DataFrame數(shù)據(jù)繪制柱狀圖的方法,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過來看看吧2018-04-04

