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

posted on 2018-05-27 17:00 風雨一肩挑 閱讀( ...) 評論( ...) 編輯 收藏
轉載于:https://www.cnblogs.com/hiwuchong/p/9096542.html