天天看點

python 實作無DSN處理sybase資料

  1. 攻城獅挖的坑隻有運維知道,隻能自己想辦法解決一些重複性修正工作。目标資料庫sybase,鮮少的但是被SAP收購了。通過python實作客戶自助資料修正,確定資料正常流通。
  2. 先安裝sybase的odbc驅動,大家可以百度下,雖然不用配置DSN但是ODBC還是需要的。
  3. 如下完整代碼,因涉及到資料安全敏感資訊***代替
# -*- 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()