版权声明:本文为博主原创文章,转载本站文章请注明作者和出处,请勿用于任何商业用途。 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()