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()

運行結果如下:

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM