参考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实现增删改查的更多相关文章

  1. .net 连接SqlServer数据库及基本增删改查

    一.写在前面 因为这学期选修的 .net 课程就要上机考试了,所以总结下.net 操作 SqlServer 数据的方法.(因为本人方向是 Java,所以对.net 的了解不多,但以下所写代码均是经过测 ...

  2. python连接sql server数据库实现增删改查

    简述 python连接微软的sql server数据库用的第三方模块叫做pymssql(document:http://www.pymssql.org/en/stable/index.html).在官 ...

  3. python操作mysql数据库增删改查的dbutils实例

    python操作mysql数据库增删改查的dbutils实例 # 数据库配置文件 # cat gconf.py #encoding=utf-8 import json # json里面的字典不能用单引 ...

  4. Java连接MySQL数据库增删改查通用方法

    版权声明:本文为博主原创文章,未经博主允许不得转载. Java连接MySQL数据库增删改查通用方法 运行环境:eclipse+MySQL 以前我们Java连接MySQL数据库都是一个数据库写一个类,类 ...

  5. java连接mysql以及增删改查操作

    java连接数据库的代码基本是固定的,步骤过程觉得繁琐些,代码记起来对我来说是闹挺.直接上代码: (温馨提醒:你的项目提前导入连接数据库的jar包才有的以下操作 ) class DBConnectio ...

  6. 使用MySQL练习增删改查时因为版本问题出现连接错误

    使用MySQL练习增删改查时出现连接错误,错误提示如下: 2020-02-19 19:53:51.088 ERROR 16328 --- [reate-249798694] com.alibaba.d ...

  7. python操作三大主流数据库(8)python操作mongodb数据库②python使用pymongo操作mongodb的增删改查

    python操作mongodb数据库②python使用pymongo操作mongodb的增删改查 文档http://api.mongodb.com/python/current/api/index.h ...

  8. Asp.Net操作MySql数据库增删改查

    Asp.Net操作MySql数据库增删改查,话不多说直接步入正题.git源码地址:https://git.oschina.net/gxiaopan/NetMySql.git  1.安装MySQL数据库 ...

  9. jsp+Servlet+JavaBean+JDBC+MySQL项目增删改查

    1简单的Mvc,分层建包. java resources src/mian/java (1)dao 包 JDBC连接类,连接数据库.增删改查方法,其他的方法. (2)model包 实体类,数据库字段, ...

随机推荐

  1. .NET高级特性-Emit(2.1)字段

    在上篇blog写完的几天后,有读者反映写的过于复杂,导致无法有效的进行实践:博主在考虑到园子里程序员水平高低不一致的情况,所以打算放慢脚步,对类的一些内容进行详细的讲解,顺带的会写一些笔者所遇到过的E ...

  2. day48天jQuary

    今日内容 jQuery jQuery引入 下载链接:[jQuery官网](https://jquery.com/),首先需要下载这个jQuery的文件,然后在HTML文件中引入这个文件,就可以使用这个 ...

  3. php之自动加载(懒加载)

    有A类和B类,如果在A类实例化B类,最简单直接的方法就是在B中使用include require_once A的文件,但是这种方法显然是不友好的,在框架中叶不是这么做的,在框架中使用的是自动加载的机制 ...

  4. kube-nginx 和 keepalived 部署安装

    目录 简介 nginx 安装配置 下载编译nginx 配置Nginx文件,开启4层透明转发 配置Nginx启动文件 keepalived 安装配置 安装keeplive服务 配置keeplive服务 ...

  5. ansible roles 介绍和使用

    目录 roles roles 介绍 创建role的步骤 role内个目录中可用的文件 案例 roles roles 介绍 ansible 自1.2版本引入的新特性,用于层次性.结构化地组织playbo ...

  6. java关键字 保留字

    Java 关键字和保留字 Java 关键字列表 (依字母排序 共51组): abstract, assert,boolean, break, byte, case, catch, char, clas ...

  7. 月下无限连?拒绝无休止switch!

    拒绝无休止switch 一.前言 前天碰到个需求,其实很简单,就是Excel导入,Excel模板长下面这样: 按我平常的逻辑是这样做的: 用文件输入流读取Excel,根据Excel的版本生成不同的对象 ...

  8. CSS+HTML实现移动端div左右滑动展示

    由于手机屏幕的宽度有限,内容太多移动设备一行装不下的,所以很多移动端网站的导航栏都有左右滑动效果,下面我就用CSS+HTML实现移动端div左右滑动展示. CSS:box设置文本不换行,子元素box1 ...

  9. 用launchscreen.storyboard适配启动图方法(二)

    背景 之前有写一篇实现方式比较简单的随笔用launchscreen.storyboard适配启动图方法,顺便在评论区提了一下用autolayout适配启动图的思路,现把思路和流程记录下来. 思路 整体 ...

  10. MyBatis的配置与使用(增,删,改,查)

    ---恢复内容开始--- Mybatis入门介绍 一.MyBatis介绍 什么是MyBtis? MyBatis 是一个简化和实现了 Java 数据持久化层(persistence layer)的开源框 ...