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使用流程:

  1. 引入API模块。
  2. 获取与数据库的连接。
  3. 执行SQL语句和存储过程。
  4. 关闭数据库连接。

常用函数

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()
posted @ 2017-04-21 11:18  Ww2zero  阅读(132)  评论(0)    收藏  举报