dophon-db
項目介紹
dophon框架的數據庫模塊,也可單獨作為一個與數據庫模塊交互的部件
支持mysql數據庫連接
支持orm形式的數據操作
如有疑問請發送郵件聯系作者:ealohu@163.com
軟件架構
模塊架構分為以組件:
mysql連接組件(包括連接池,連接封裝類,分頁,結果輸出過濾器,遠程接收器,增量檢測)
orm映射組件(包括映射基礎結構定義,映射封裝工具,映射操作定義)
抽象工具集(包括結果集文件讀取,解析,熱更新,動態賦值等)
多數據源(xml,orm)管理器,已內嵌到相應模塊中
安裝教程
pip安裝:
pip install dophon-db [--user]
使用說明
0. 配置相關
# 此處為數據庫配置
pool_conn_num = 5 # size of db connect pool() # 數據庫連接池連接數(默認5個)
pydc_host = 'localhost' # 數據庫連接地址
pydc_port = 3306 # 數據庫連接端口
pydc_user = 'username' # 數據庫連接用戶名
pydc_password = 'password' # 數據庫連接密碼
pydc_database = 'database' # 連接數據庫名(可在后面跟連接參數)
pydc_xmlupdate_sech = False # 結果集映射調度開關
db_pool_exe_time = False # 連接池執行時間調試開關
# 多數據源配置(數據庫表創建請看test/test.sql)
db_cluster = [
{
'alias': 'data-a',
'host': 'localhost',
'port': 3306,
'database': 'test1',
'user': 'root',
'password': 'root'
}, {
'alias': 'data-b',
'host': 'localhost',
'port': 3306,
'database': 'test2',
'user': 'root',
'password': 'root'
}, {
'alias': 'data-c',
'host': 'localhost',
'port': 3306,
'database': 'test3',
'user': 'root',
'password': 'root',
'tables':['a','user']
}, {
'alias': 'data-d',
'host': 'localhost',
'port': 3306,
'database': 'test4',
'user': 'root',
'password': 'root'
}
]
1. 結果集映射方式
結果集:sql執行腳本的一個集合,由于在實際開發中查詢居多,簡稱結果集
通過xml文件規范若干結果集組成
mysql.xml
SELECT
*
FROM
table
通過代碼關聯xml文件,初始化結果集
from dophon.mysql import *
_cursor=db_obj(mysql.xml,auto_fix=True)
# 根路徑為配置文件路徑
# 文件路徑必須以/開頭
通過代碼獲取xml文件其中某一個結果集(以id區分)
result= _cursor.exe_sql(methodName='findAll')
支持動態參數傳入(#{}形式)以及骨架參數傳入(${形式})
動態參數傳入:
SELECT
*
FROM
table
WHERE
id=#{id}
result= _cursor.exe_sql(methodName='findAllById',args={'id':'12345678'})
骨架參數傳入:
SELECT
*
FROM
${table_name}
result= _cursor.exe_sql(methodName='findAllByTableName',args={'table_name':'test_table'})
支持單條查詢,列表查詢,隊列查詢(結果集id與參數列表的列表形式和字典形式)
單條查詢:
SELECT
*
FROM
table
WHERE
id=#{id}
result= _cursor.exe_sql_single(methodName='findAllById',args={'id':'12345678'})
# result
列表查詢:
SELECT
*
FROM
table
WHERE
id=#{id}
result= _cursor.exe_sql(methodName='findAllById',args={'id':'12345678'})
# result
隊列查詢:
1.列表形式:
result= _cursor.exe_sql_queue(
method_queue=['test1','test2'],
args_queue=[
{'id':'123456','name':'tom'},
{}
]
)
# result
# {
# method_name:exec_result
# }
2.字典形式:
result= _cursor.exe_sql_obj_queue(
queue_obj={
'test1':{
'id':'123456'
},
'test2':{}
}
)
# result
# {
# method_name:exec_result
# }
支持結果集文件熱更新
update_round(_cursor,1)
# update_round(,second:int)
支持遠程維護結果集文件
# remote_path為xml文件下載地址
remote_cell = remote.get_cell('test.xml', remote_path='http://127.0.0.1:8400/member/export/xml/test.xml')
_cursor = db_obj(remote_cell.getPath(), debug=True)
# 或者
_cursor = db_obj(remote_cell, debug=True)
2. 表模型映射方式
暫時支持單條事務操作
通過初始化模型管理器獲取數據庫表映射骨架
from dophon import orm
manager = orm.init_orm_manager(['user'])
通過實例化映射骨架獲取表操作緩存實例(操作實例)
user = manager.user()
通過對操作實例賦值進行對對應表模擬操作
print('打印對象變量域')
for attr in dir(user):
print(attr, ":", eval("user." + attr))
print('開始對對象賦值')
user.user_id = 'id'
user.info_id = 'info_id'
user.user_name = 'user_name'
user.user_pwd = 'user_pwd'
user.user_status = 123
user.create_time = datetime.datetime.now().strftime('%y-%m-%d')
user.update_time = datetime.datetime.now().strftime('%y-%m-%d')
print('對象賦值完畢')
print('打印對象變量域')
for attr in dir(user):
print(attr, ":", eval("user." + attr))
print('打印對象參數表')
print(user([]))
print('user([]):', user([]))
print("user(['user_id','info_id']):", user(['user_id', 'info_id']))
print("user.get_field_list():", user.get_field_list())
print("user.alias('user_table').get_field_list():", user.alias('user_table').get_field_list())
通過對操作實例結構化操作對數據庫對應表結構進行數據落地操作
# 打印對象操作語句(內部方法)
print(user.where())
print(user.values())
user.select() # 執行對象查詢操作(未賦值對象執行全部查詢)
user.user_name = '111' # 對對象某一屬性賦值
user.select_one() # 執行單條條件查詢(條件為對象已有值),復數結果時拋出異常
user.select_all() # 執行全部條件查詢(條件為對象已有值)
user = manager.user() # 獲取另一個模型對象
user.alias('u').select() # 對對象賦予別名并執行全部查詢操作
user.user_name = '111' # 對對象某一屬性賦值
user.alias('us').select_one() # 對對象賦予另一個別名并執行全部查詢操作
user.alias('userr').select_all() # 對對象賦予另一個別名并執行全部查詢操作
# 對對象某一屬性賦值(屬性類型與數據庫類型相對應)
user.user_id='test_id' # 字符串類型
user.info_id='test_info_id'
user.user_name='test_user_name'
user.user_pwd='test_user_pwd'
user.user_status=1 # 數字類型
user.create_time = datetime.datetime.now().strftime('%y-%m-%d') # 日期類型
user.update_time = datetime.datetime.now().strftime('%y-%m-%d')
print(user.insert()) # 執行對象插入操作并打印操作結果
# 對對象某一屬性賦值并選擇其中某部分屬性進行更新,其中指定了執行更新查詢條件
user.user_id = 'test_id'
user.info_id = 'info_id'
user.user_name = '柯李藝'
user.user_pwd = '333'
user.user_status = 123
print(user.update(update=['user_name','user_pwd'],where=['user_id']))
# 對對象某一屬性賦值并指定刪除條件進行刪除操作
user.user_id = 'test_id'
user.info_id = 'info_id'
user.user_name = 'user_name'
user.user_pwd = 'user_pwd'
user.user_status = 123
print(user.delete(where=['user_id']))
# 獲取兩個新的模型對象
user1=manager.user()
user2=manager.user()
# 打印對象1的全部查詢結果
print(user1.select())
# 對對象1屬性賦值
user1.user_name='early'
# 執行對象1左關聯對象2,并指定關聯關系(user1.user_id = user2.user_id)
user1.left_join(user2,['user_id'],['user_id'])
# 執行對象1左關聯對象2,指定對象1別名(u1),對象2別名(u2),并指定關聯關系(user1.user_id = user2.user_id)
user1.alias('u1').left_join(user2.alias('u2'),['user_id'],['user_id'])
# print(user1.exe_join())
# 打印對象1關聯后的全部查詢結果
print(user1.select())
"""
模型對象的復制與生成
"""
# 獲取新的模型操作對象
user1 = manager.user()
print('user1', '---', id(user1)) # 打印對象1的id
user2 = user1.copy_to_obj(manager.user) # 利用對象管理器實例中的模型模板進行對象獲取
print('user2', '---', id(user2)) # 打印對象2的id
print(user1('user_id'))
user3 = user1.read_from_dict({
'user_id': '111'
}) # 利用模型對象中的翻譯方法將字典生成一個新的模型對象
print('user3', '---', id(user3)) # 打印對象3的id
# 對比兩者id
print(user1('user_id'))
print(user3('user_id'))
參與貢獻
若有意向參與貢獻,請留言或發送郵件至ealohu@163.com
Fork 本項目
新建 Feat_xxx 分支
提交代碼
新建 Pull Request