- 攻城獅挖的坑隻有運維知道,隻能自己想辦法解決一些重複性修正工作。目标資料庫sybase,鮮少的但是被SAP收購了。通過python實作客戶自助資料修正,確定資料正常流通。
- 先安裝sybase的odbc驅動,大家可以百度下,雖然不用配置DSN但是ODBC還是需要的。
- 如下完整代碼,因涉及到資料安全敏感資訊***代替
# -*- coding:utf-8 -*-
__Author__ = '秦嶺'
import pypyodbc
class DatadbaseService:
'''
提供sybase資料庫操作類
'''
__sql=''
__item=()
__cnn=''
def __init__(self,driver,network_address,database,name,pwd):
self.__driver=driver
self.__network_address=network_address
self.__database=database
self.__name=name
self.__pwd=pwd
@property
def sys_network_address(self):
return self.__network_address
@sys_network_address.setter
def sys_network_address(self,network_address):
if network_address!='':
self.__network_address=network_address
return True
else:
print('伺服器位址不存在')
return False
@property
def sys_driver(self):
return self.__driver
@sys_driver.setter
def sys_driver(self,driver):
if driver!='':
self.__driver=driver
return True
else:
print('driver不能為空')
return False
@property
def sys_name(self):
return self.__name
@sys_name.setter
def sys_name(self,name):
if name!='':
self.__name=name
return True
else:
print('資料庫登入代号不能為空')
return False
@property
def sys_pwd(self):
return self.__pwd
@sys_pwd.setter
def sys_pwd(self,pwd):
if pwd!='':
self.__pwd=pwd
return True
else:
print('密碼不能為空')
return False
@property
def sys_database(self):
return self.__database
@sys_database.setter
def sys_database(self,database):
if database!='':
self.__database=database
return True
else:
print('資料庫名不能為空')
return False
@property
def sys_sql(self):
return self.__sql
@sys_sql.setter
def sys_sql(self,sql):
if sql!='':
self.__sql=sql
return True
else:
print('sql不能為空')
return False
@property
def sql_item(self):
return self.__item
@sql_item.setter
def sql_item(self,item):
if item!='':
self.__item=item
return True
else:
print('條件參數不能為空')
return False
def connet_database(self):
'''建立資料庫連接配接'''
try:
self.__cnn=pypyodbc.connect('driver={driver};networkaddress={networkaddress};database={database};charset=utf8;UID={name};PWD={pwd}'
.format(driver=self.__driver,networkaddress=self.__network_address,database=self.__database,name=self.__name,pwd=self.__pwd))
return self.__cnn
except Exception as e:
print(e)
print('請檢查資料庫連接配接參數')
def qury_databse(self,sql):
'''查詢資料庫'''
self.sys_sql=sql
try:
self.connet_database()
cur=self.__cnn.cursor()
cur.execute(self.__sql)
return cur.fetchall()
except Exception as e:
print(e)
print('查詢失敗')
finally:
self.__cnn.close()
def update_database(self,sql):
# self.sql_item=item
self.sys_sql=sql
try:
cnn=self.connet_database()
cur=cnn.cursor()
# cur.execute(sql,self.__item)
cur.execute(self.__sql)
cnn.commit()
return True
except Exception as e:
cnn.rollback()
print('修複失敗')
print(e)
return False
finally:
cnn.close()
def vrify_user(self,codes,password):
# 使用者權限驗證
if codes !='' or password !='':
try:
result=self.qury_databse('select * from ****** where codes=\'{codes}\' and password=\'{password}\''.format(codes=codes,password=password))
if result:
print('驗證成功')
return True
else:
print('登入代号或密碼不對,請請注意大小寫')
return False
except Exception as e:
print(e)
return False
else:
print('使用者密碼和密碼不能為空')
return False
codes=input('請輸入登入代号')
pwd=input('請輸入密碼')
service1=DatadbaseService('{Sybase ASE ODBC Driver}','**.**.***.**,****','***','*****','*****')
verify_re=service1.vrify_user(codes,pwd)
def update():
'''如下進行修複權限認證并進行修複'''
if verify_re:
in_id=input('請輸入系統單号,多個系統單号請使用半形逗號隔開:')
if len(in_id)<5:
print('請輸入正确的單号')
else:
for id in in_id.split(','):
if id!='':
update_sql='update ***_**** set nos=left(nos,32) where id in={id}'.format(id=int(id))
qury_sql='select 1 from ***_**** where id={id}'.format(id=id)
if len(service1.qury_databse(qury_sql))!=0:
if service1.update_database(update_sql):
print('單号{id}修複完畢,請重新傳單'.format(id=id))
else:
print('單号{id}修複失敗,請聯系管理者'.format(id=id))
else:
print('輸入的系統單号不存在,請查證後輸入')
'''遞歸調用,修複完成後進入待修複狀态'''
update()
else:
print('無權操作')
update()