Python研究学习--18--数据库编程(下)

版权声明:本文为博主原创文章,转载本站文章请注明作者和出处,请勿用于任何商业用途。 https://blog.csdn.net/wutianxu123/article/details/82530047

15.5 代码实例

数据库连接:

# -*- coding: UTF-8 -*-
import MySQLdb

db = MySQLdb.connect("localhost","testuser","test123","TESTDB" )    #打开数据库连接 
cursor = db.cursor()                                                #调用游标对象。使用cursor()方法获取操作游标
cursor.execute("SELECT VERSION()")                                  #执行SQL语句。使用execute方法执行SQL语句
data = cursor.fetchone()                                            #创建并返回一个游标。使用fetchone()方法获取一条数据
print "Database version : %s " % data                               #输出SQL语句执行结果
db.close()                                                          #关闭数据库连接

创建数据库表:

# -*- coding: UTF-8 -*-
import MySQLdb

db = MySQLdb.connect("localhost","testuser","test123","TESTDB" )    #打开数据库连接
cursor = db.cursor()                                                #调用游标对象。使用cursor()方法获取操作游标 
cursor.execute("DROP TABLE IF EXISTS EMPLOYEE")                     #执行SQL语句。此处为删除这个表
sql = """CREATE TABLE EMPLOYEE (
    FIRST_NAME  CHAR(20) NOT NULL,
    LAST_NAME  CHAR(20),
    AGE INT,  
    SEX CHAR(1),
    INCOME FLOAT )"""                                               #创建数据表SQL语句
cursor.execute(sql)                                                 #执行SQL语句
db.close()                                                          #关闭数据库连接

数据库相关执行:

# -*- coding: UTF-8 -*-
import MySQLdb

db = MySQLdb.connect("localhost","testuser","test123","TESTDB")     #打开数据库连接
cursor = db.cursor()                                                #使用cursor()方法获取操作游标
sql = """INSERT INTO EMPLOYEE(FIRST_NAME,
    LAST_NAME, AGE, SEX, INCOME)
    VALUES ('Mac', 'Mohan', 20, 'M', 2000)"""                       #SQL插入语句
sql2 = "UPDATE EMPLOYEE SET AGE = AGE + 1 WHERE SEX = '%c'" % ('M') #SQL更新语句
sql3 = "DELETE FROM EMPLOYEE WHERE AGE > '%d'" % (20)               #SQL删除语句
try:
    cursor.execute(sql)                                             #执行sql语句。也可以执行sql2或sql3
    db.commit()                                                     #提交到数据库执行
except:
    db.rollback()                                                   #发生错误时执行该语句,为回滚
db.close()                                                          #关闭数据库连接

数据库查询及处理:

# -*- coding: UTF-8 -*-
import MySQLdb

db = MySQLdb.connect("localhost","testuser","test123","TESTDB")     #打开数据库连接
cursor = db.cursor()                                                #使用cursor()方法获取操作游标 
sql = "SELECT * FROM EMPLOYEE \
    WHERE INCOME > '%d'" % (1000)                                   #SQL查询语句

try: 
    cursor.execute(sql)                                             #执行SQL语句
    results = cursor.fetchall()                                     #获取执行结果所有记录列表
    for row in results:                                             #结果集整理
        fname = row[0]
        lname = row[1]
        age = row[2]
        sex = row[3]
        income = row[4]
        print "fname=%s,lname=%s,age=%d,sex=%s,income=%d" % \
            (fname, lname, age, sex, income )                       #打印结果
except:
    print "错误!没有取到数据"
db.close()                                                          #关闭数据库连接

Python访问数据库实例:

#-*-coding: utf-8-*-  

import os  
from random import randrange as rrange  

COLSIZ = 10                                                         #设置一变量  
RDBMSs = {'s': 'sqlite', 'm': 'mysql', 'g': 'gadfly'}  
DB_EXC = None                                                       #代表数据库异常  

HOST='127.0.0.1'                                                    #这里是HOST地址
User='root'                                                         #用户名
Passwd='password'                                                   #密码
Port=3306                                                           #mysql默认端口
Charset='utf8'                                                      #编码方式

#选择数据库  
def setup():  
    return RDBMSs[raw_input(''' 
    Choose a database system: 

    (M)ySQL 
    (G)adfly 
    (S)QLite 

    Enter choice: ''').strip().lower()[0]]  

#依据不同的数据库,创建连接对象  
def connect(db, dbName):  
    global DB_EXC  
    dbDir = '%s_%s' % (db, dbName)  

#如果数据库是sqlite,则执行此处
    if db == 'sqlite':          
        try:                                                        #尝试载入需要的数据库模型,如果找不到合适的模块,None值被返回 
            import sqlite3                                          #尝试载入标准库模块sqlite3  
        except ImportError, e:  
            try:  
                from pysqlite2 import dbapi2 as sqlite3             #载入sqlite3失败,则选择第三方模块pysqlite2载入  
            except ImportError:  
                return None  

        DB_EXC = sqlite3  
        if not os.path.isdir(dbDir):                                #SQLite是基于文件的数据库系统,需要确认数据库文件所在目录是否存在  
            os.mkdir(dbDir)                                         #若没有该文件则新建  
        cxn = sqlite3.connect(os.path.join(dbDir, dbName))          #连接数据库

#如果数据库是mysql,则执行此处
    elif db == 'mysql':  
        try:  
            import MySQLdb  
            import _mysql_exceptions as DB_EXC  
        except ImportError, e:  
            return None  

        try:  
            cxn = MySQLdb.connect(HOST='127.0.0.1',User='root',Passwd='password',Port=3306,Charset='utf8')  
        except _mysql_exceptions.OperationalError, e:  
            cxn = MySQLdb.connect(HOST='127.0.0.1',User='root',Passwd='password',Port=3306,Charset='utf8')  

        try:  
            cxn.query('DROP DATABASE %s' % dbName)  
        except DB_EXC.OperationalError, e:  
            pass  

        cxn.query('CREATE DATABASE %s' % dbName)  
        cxn.commit()  
        cxn.close()  
        cxn = MySQLdb.connect(HOST='127.0.0.1',User='root',Passwd='password',Port=3306,Charset='utf8')  

#如果数据库是gadfly,则执行此处
    elif db == 'gadfly':                                            #选这个会报错,具体是gadfly下的bindings.py的syntax error
        try:  
            from gadfly import gadfly  
            DB_EXC = gadfly  
        except ImportError, e:  
            return None  

        try:  
            cxn = gadfly(dbName, dbDir)  
        except IOError, e:  
            cxn = gadfly()  
            if not os.path.isdir(dbDir):  
                os.mkdir(dbDir)  
            cxn.startup(dbName, dbDir)  

#如果哪个数据库都不是
    else:  
        return None  
    return cxn  

#创建新的user表  
def create(cur):  
    try:  
        cur.execute('''
        CREATE TABLE users ( 
            login VARCHAR(8), 
            uid INTEGER, 
            prid INTEGER) 
            ''')                                                    #单行也没问题。如下:  
        #cur.execute('CREATE TABLE users (login VARCHAR(8), uid INTEGER, prid INTEGER)')  
    except DB_EXC.OperationalError, e:  
        drop(cur)                                                   #删除表  
        create(cur)                                                 #递归,重新创建表,若创建失败,会陷入死循环  

drop = lambda cur: cur.execute('DROP TABLE users')  

#将NAMES设计成元组,使得能多次利用该元组生成列表供下面的生成器函数  
NAMES = (  
    ('aaron', 8312), ('angela', 7603), ('dave', 7306),  
    ('davina', 7902), ('elliot', 7911), ('ernie', 7410),  
    ('jess', 7912), ('jim', 7512), ('larry', 7311),  
    ('leslie', 7808), ('melissa', 8602), ('pat', 7711),  
    ('serena', 7003), ('stan', 7607), ('faye', 6812),  
    ('amy', 7209),  
)  

def randName():                                                     #生成器函数  
    pick = list(NAMES)                                              #将NAMES转化成pick  
    while len(pick) > 0:  
        yield pick.pop(rrange(len(pick)))                           #随机移除pick中的一项  

#在数据库中插一行数据  
def insert(cur, db):  
    if db == 'sqlite':  
        cur.executemany("INSERT INTO users VALUES(?, ?, ?)", [(who, uid, rrange(1, 5)) for who, uid in randName()])  
    elif db == 'gadfly':                                            #gadfly没有executemany方法,只能一行一行地插入数据  
        for who, uid in randName():  
            cur.execute("INSERT INTO users VALUES(?, ?, ?)", (who, uid, rrange(1, 5)))  
    elif db == 'mysql':  
        cur.executemany("INSERT INTO users VALUES(%s, %s, %s)", [(who, uid, rrange(1, 5)) for who, uid in randName()])  

#cur.rowcount用来记录最后一次execute影响的行数  
getRC = lambda cur: cur.rowcount if hasattr(cur, 'rowcount') else -1  #条件表达式,如果有rowcount属性,则返回最后一次execute操作返回或影响的行数  

#在user表中选几条记录,更改prid字段  
def update(cur):  
    fr = rrange(1, 5)  
    to = rrange(1, 5)  
    cur.execute("UPDATE users SET prid=%d WHERE prid=%d" % (to, fr))  
    return fr, to, getRC(cur)  

#在user表中选prid字段等于某个值的记录,将它们删除  
def delete(cur):  
    rm = rrange(1, 5)  
    cur.execute("DELETE FROM users WHERE prid=%d" % rm)  
    return rm, getRC(cur)  

#从数据库中读取数据,并将数据进行格式化,然后打印  
def dbDump(cur):  
    cur.execute("SELECT * FROM users")                            #读取所有数据  
    print '\n%s%s%s' % ('LOGIN'.ljust(COLSIZ), 'USERID'.ljust(COLSIZ), 'PROJ#'.ljust(COLSIZ))              #ljust是将字符串左对齐,COLSIZ是预定的宽度  
    for data in cur.fetchall():  
        print '%s%s%s' % tuple([str(s).title().ljust(COLSIZ) for s in data])    #首先是将三列数据转换成字符串,再首字母大写,最后左对齐  

def main():  
    db = setup()  
    print '*** Connecting to %r database' % db  
    cxn = connect(db, 'test')  
    if not cxn:  
        print 'ERROR: %r not supported, exiting' % db  
        return 
    cur = cxn.cursor()                         #游标对象

    print '\n*** Creating users table'  
    create(cur)  

    print '\n*** Inserting names into table'  
    insert(cur, db)  
    dbDump(cur)  

    print '\n*** Randomly moving folks',  
    fr, to, num = update(cur)  
    print 'from one group (%d) to another (%d)' % (fr, to)  
    print '\t(%d users moved)' % num  
    dbDump(cur)  

    print '\n*** Randomly choosing group',  
    rm, num = delete(cur)  
    print '(%d) to delete' % rm  
    print '\t(%d users removed)' % num  
    dbDump(cur)  

    print '\n*** Dropping users table'  
    drop(cur)  
    cur.close()  
    cxn.commit()  
    cxn.close()  

if __name__ == "__main__":  
    main()

猜你喜欢

转载自blog.csdn.net/wutianxu123/article/details/82530047