show_you_my_codes 002
program 002
第 0002 题:将 0001 题生成的 200 个激活码(或者优惠券)保存到 MySQL 关系型数据库中。
code
# -*- coding: utf-8 -*-
# __author__:Ww2zero
import MySQLdb
import string
import random
class ACMySqlDB(object):
"""
# 第 0002 题:将 0001 题生成的 200 个激活码(或者优惠券)保存到 MySQL 关系型数据库中。
"""
def __init__(self):
self.conn = None
self.cur = None
self.config = {
'user': 'root',
'passwd': '2014',
'host': '127.0.0.1',
'db': 'userkeys',
'charset': 'utf8',
}
def connect(self):
self.conn = MySQLdb.connect(**self.config)
def cursor(self):
try:
self.cur = self.conn.cursor()
except (AttributeError, MySQLdb.OperationalError):
self.connect()
self.cur = self.conn.cursor()
def createTable(self):
'''
CREATE TABLE `ukeys` (
`uid` int UNSIGNED NOT NULL AUTO_INCREMENT ,
`ukey` varchar(60) NOT NULL ,
PRIMARY KEY (`uid`)
);
'''
sql_create = ''' CREATE TABLE `ukeys` ( `uid` int UNSIGNED NOT NULL AUTO_INCREMENT , `ukey` varchar(60) NOT NULL ,PRIMARY KEY (`uid`) )'''
self.cur.execute(sql_create)
def InsertDatas(self, key_list):
'''
INSERT INTO `uKeys` (`uid`, `ukey`) VALUES ('1', '2')
'''
sql_insert = "INSERT INTO `uKeys` (`ukey`) VALUES (%(value)s)"
self.cur.executemany(sql_insert, [dict(value=v) for v in key_list])
def query(self, sql):
'''
查询sql
'''
self.cur.execute(sql)
rows = self.cur.fetchall()
return rows
def QueryData(self):
sql_select = "select ukey from ukeys"
rows = self.query(sql_select)
self.printResult(rows)
def printResult(self, rows):
if rows is None:
print "rows None"
for row in rows:
print row
def DeleteData(self, uid):
sql_delete = "delete from `uKeys` where id=" + uid
self.cur.execute(sql_delete)
def DropTable(self):
sql_drop = '''DROP TABLE IF EXISTS `ukeys`'''
self.cur.execute(sql_drop)
def commit(self):
self.conn.commit()
def close(self):
self.cur.close()
self.conn.close()
class ActivateCodes(object):
"""
生成激活码
"""
def __init__(self):
# 字典域 由数字和字母(包括大小写)组成
self.FIELD = string.digits + string.letters
self.GENERATE = None
def createCodes(self, codenumber=10, codesize=10):
"""
生成codenumber组随机码,每组生成的码的长度为codesize
"""
def getCode(codesize):
"""
得到codesize位激活码
"""
return "".join(random.sample(self.FIELD, codesize))
self.GENERATE = [getCode(codesize) for i in range(codenumber)]
return True
def writeInFile(self, file):
"""
写入文件 并按顺序排列
"""
for i in self.GENERATE:
with open(file, "a") as boom:
boom.write(i + " \n")
def saveinMySQL(self):
db = ACMySqlDB()
db.connect()
db.cursor()
db.DropTable()
db.createTable()
db.InsertDatas(self.GENERATE)
db.commit()
db.QueryData()
db.close()
if __name__ == "__main__":
ac = ActivateCodes()
ac.createCodes(200, 30)
ac.saveinMySQL()
module
MySQLdb
MySQLdb是用于Python链接Mysql数据库的接口,它实现了Python 数据库API规范V2.0,基于MySQL C API上建立的。
Python DB-API使用流程:
- 引入API模块。
- 获取与数据库的连接。
- 执行SQL语句和存储过程。
- 关闭数据库连接。
常用函数
Python DB API 2.0 对事务提供了两个方法:
- commit() 提交
- rollback() 回滚
cursor用来执行命令的方法:
- callproc(self, procname, args) 用来执行存储过程,接收的参数为存储过程名和参数列表,返回值为受影响的行数
- execute(self, query, args) 执行单条sql语句,接收的参数为sql语句本身和使用的参数列表,返回值为受影响的行数
- executemany(self, query, args) 执行单挑sql语句,但是重复执行参数列表里的参数,返回值为受影响的行数
- nextset(self) 移动到下一个结果集
cursor用来接收返回值的方法:
- fetchall(self) 接收全部的返回结果行.
- fetchmany(self, size=None) 接收size条返回结果行.如果size的值大于返回的结果行的数量,则会返回cursor.arraysize条数据.
- fetchone(self) 返回一条结果行.
- rowcount 这是一个只读属性,并返回执行execute() 方法后影响的行数。
- scroll(self, value, mode='relative') 移动指针到某一行; 如果mode='relative',则表示从当前所在行移动value条,如果 mode='absolute',则表示从结果集的第一行移动value条.
在python3下,MySQLdb模块不再提供支持,此时可以使用另一个模块PyMySQL,它支持python2和python3。
参考链接
http://www.cnblogs.com/conanwang/p/6028110.html
cx_Oracle
Python使用cx_Oracle模块连接Oracle,实现对oracle的操作。
http://cx-oracle.sourceforge.net/
不能通过pip安装时,使用下面网址的win安装包进行安装模块。
https://pypi.python.org/pypi/cx_Oracle/5.3
基本的操作流程如下:
1.引用模块cx_Oracle
2.连接数据库
3.获取cursor
4.使用cursor进行各种操作
5.关闭cursor
6.关闭连接
常用方法
创建数据库连接connect和关闭数据库连接close
方法一:用户名、密码和监听分开写
import cx_Oracle
db=cx_Oracle.connect('username/password@host/orcl')
db.close()
方法二:用户名、密码和监听写在一起
import cx_Oracle
db=cx_Oracle.connect('username','password','host/orcl')
db.close()
方法三:配置监听并连接
import cx_Oracle
tns=cx_Oracle.makedsn('host',1521,'orcl')
db=cx_Oracle.connect('username','password',tns)
db.close()
建立cursor并执行SQL语句
import cx_Oracle #引用模块cx_Oracle
conn=cx_Oracle.connect('username/password@host/orcl') #连接数据库
c=conn.cursor() #获取cursor
x=c.execute('select sysdate from dual') #使用cursor进行各种操作
x.fetchone() #fetchall()获取全部结果
c.close() #关闭cursor
conn.close() #关闭连接
调用存储过程和方法
--存储过程代码:
CREATE OR REPLACE PROCEDURE P_DEMO(V1 IN VARCHAR2, V2 OUT VARCHAR2) IS
BEGIN
V2 := V1;
END;
#Python代码:
import cx_Oracle
conn=cx_Oracle.connect('username/password@host/orcl')
c=conn.cursor()
str1='nice'
str2=' '#需要有值,即len(str2)>=len(str1)
x=c.callproc('p_demo',[str1,str2]) #callproc()调用存储过程
print(str2)
c.close()
conn.close()
------------------------------------------------------------------------------
--函数代码:
CREATE OR REPLACE function F_DEMO(V1 VARCHAR2) RETURN VARCHAR2 IS
BEGIN
RETURN V1;
END;
#Python代码:
import cx_Oracle
conn=cx_Oracle.connect('username/password@host/orcl')
c=conn.cursor()
str1='nice'
str2=c.callfunc('f_demo',cx_Oracle.STRING,[str1]) #callfunc() 调用函数 需要指定传输参数的类型
print(str2)
c.close()
conn.close()

浙公网安备 33010602011771号