天天看點

python連接配接sqlserver和MySQL實作增删改查

python連接配接sqlserver和MySQL實作增删改查

參考python核心程式設計

編寫一個使用者洗牌的腳本,根據使用者輸入,選擇連接配接sqlserver或者MySQL,建立資料庫、表,随機生成資料,并實作增删改查。

其中,為了相容python2和python3,統一了列印函數、錄入函數、動态導包等

一些字段聲明為全局變量,這樣我們在後續的學習中,可以引用這些變量和函數。

ushuffle.py:

#python 3.6
#統一輸出函數,使用distutils.log.warn()函數代替版本2中的print語句和版本3中的print函數
from distutils.log import warn as printf
from random import randrange
#檢測内置函數中是否包括raw_input(),如果存在說明版本是2(或者1),不存在說明是3。這樣的話,無論是哪個版本,最終scanf函數表示了該功能
if isinstance(__builtins__,dict) and 'raw_input' in __builtins__:
    scanf = raw_input
elif hasattr(__builtins__,'raw_input'):
    scanf = raw_input
else:
    scanf = input

FIELDS = ('login','userid','projid')
COLSIZ = 10
RDBMSs = {'s':'sql server','m':'mysql'}
DBNAME = 'test'
DB_EXC = None
DBUSER = 'root'
DBSERVER = '127.0.0.1'
NAMELEN = 10

tformat = lambda s: str(s).title().ljust(COLSIZ)#str().title()将單詞首字母大寫;ljust()左對齊,并使用空格填充直至達到指定長度
cformat = lambda s: s.upper().ljust(COLSIZ) #

def setup():
    return RDBMSs[scanf('''
    請選擇資料庫類型:
    (Sql) Server
    (M)ySQL
    
    請鍵入:''').strip().lower()[0]]

def connect(db,DBNAME):
    global DB_EXC
    dbDir = '%s_%s' % (db,DBNAME)
    if db == 'mysql':
        try:
            #python3.0以前的版本
            import MySQLdb
            import _mysql_exceptions as DB_EXC
            try:
                cxn = MySQLdb.connect(user = DBUSER,password = 'Jwxjs123456',db=DBNAME)
            except DB_EXC.OperationalError:
                try:
                    cxn = MySQLdb.connect(user = DBUSER,password = 'Jwxjs123456',db=DBNAME)
                    cxn.query('create database %s' % DBNAME)
                    cxn.commit()
                    cxn.close()
                    cxn = MySQLdb.connect(db=DBNAME)
                except DB_EXC.OperationalError:
                    return None
        except ModuleNotFoundError: #ImportError
            try:
                #python3.0以上的版本
                import pymysql
                import pymysql.err as DB_EXC
                try:
                    cxn = pymysql.connect(**{'host':DBSERVER,'database':DBNAME,'user':DBUSER,'password':'Jwxjs123456'})
                except DB_EXC.InternalError:
                    #連接配接成功但是沒有指定的資料庫
                    cxn = pymysql.connect(**{'host':DBSERVER,'user':DBUSER,'password':'Jwxjs123456'})
                    cur = cxn.cursor()
                    cur.execute('create database %s;' % DBNAME)
                    cxn.commit()
                    cxn = pymysql.connect(**{'host':DBSERVER,'database':DBNAME,'user':DBUSER,'password':'Jwxjs123456'})
            except ImportError:
                return None
    elif db == 'sql server':
        import pymssql
        import _mssql
        #import pymssql.StandardError as DB_EXC
        try:
            cxn = pymssql.connect(**{'server':DBSERVER,'database':DBNAME,'password':'Jwxjs123456','user':'sa'})
            printf('     成功連結資料庫%s' % DBNAME)
        except BaseException:
            #這裡一定要設定為自動送出模式,否則建立資料庫會失敗
            cxn = pymssql.connect(**{'server':DBSERVER,'password':'Jwxjs123456','user':'sa','autocommit':True})
            
            cursor = cxn.cursor()
            cxn.commit()
            cursor.execute('create database %s;' % DBNAME)
            #cxn.close()
            cxn = pymssql.connect(**{'server':DBSERVER,'database':DBNAME,'password':'Jwxjs123456','user':'sa','autocommit':True})
            printf('資料庫%s 不存在,建立該資料庫' % DBNAME)
    return cxn

def create(cur):
    try:
        cur.execute('''
            create table users(login varchar(%s),
                userid int,
                projid int
            )
        ''' % NAMELEN)
        printf('……………建立users表成功')
    except BaseException:
        drop(cur)
        create(cur)
        printf('       已存在表users,删除後并建立此表……………………')
        
drop = lambda cur:cur.execute('drop table users')

NAMES =(
    ('arron',8312),('angle',7603),('dane',7306),
    ('jess',7912),('jim',7512),('larry',7311),
)

def randName():
    pick = set(NAMES)#内置函數set()建立一個無序不重複元素集,可進行關系測試,删除重複資料,還可以計算交集、差集、并集等
    while pick:
        yield pick.pop()

def insert(cur,db):
    cur.executemany('insert into users values(%s,%s,%s)',[(who,uid,randrange(1,5)) for who,uid in randName()])

#傳回最後一次操作影響的行數,這裡考慮右邊對象是不是支援該屬性,不支援的話則傳回-1
getRC = lambda cur:cur.rowcount if hasattr(cur,'rowcount') else -1
    
    
def update(cur):
    fr = randrange(1,5)
    to = randrange(1,5)
    cur.execute('update users set projid = %s where projid = %s' % (to,fr))
    return fr,to,getRC(cur)
    
def dbDump(cur):
    cur.execute('select * from users')
    printf('\n%s' % ''.join(map(cformat,FIELDS)))
    for data in cur.fetchall():
        printf(''.join(map(tformat,data)))#join()将序列中的元素以指定的字元連接配接生成一個新的字元串。

def delete(cur):
    rm = randrange(1,5)
    cur.execute('delete from users where projid = %s' % rm)
    return rm,getRC(cur)

drop = lambda cur:cur.execute('drop table users')
    
    
def main():
    #使用者選擇資料庫類型
    db = setup()
    printf('\n****将要連接配接到 %s(%s) 資料庫****' % (DBNAME,db))
    #建立資料庫連接配接
    cxn = connect(db,DBNAME)
    if not cxn:
        printf('\n     連接配接資料庫%s(%s) 失敗,程式退出!!!' % (DBNAME,db))
        return
    else:
        printf('\n    成功連接配接資料庫%s(%s)    ' % (DBNAME,db))
    cur = cxn.cursor()
    printf('\n      建立 users表……')
    create(cur)
    
    printf('\n*****初始化users表******')
    insert(cur,db)
    dbDump(cur)
    
    printf('\n ***随機更改projid****')
    fr,to,num = update(cur)
    printf('\t(%s 個使用者被更改了) from (%s) to(%s)' % (num,fr,to))
    dbDump(cur)
    
    printf('\n***随機删除某一組資料***')
    rm,num = delete(cur)
    printf('\t(組%s中共%s個使用者被删除了)' % (rm,num))
    dbDump(cur)
    
    printf('\n*****删除users表*******')
    drop(cur)

    if db == 'mysql':
        cxn.commit() #sqlserver 的連結已經被設定為自動送出
    printf('\n    關閉資料庫連接配接     ')
    cxn.close()
    
if __name__ == '__main__':
    main()      

運作結果如下:

python連接配接sqlserver和MySQL實作增删改查

posted on 2018-05-27 17:00 風雨一肩挑 閱讀( ...) 評論( ...) 編輯 收藏

轉載于:https://www.cnblogs.com/hiwuchong/p/9096542.html