參考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()
運行結果如下: