1、mysql查询操作:
#!/usr/bin/python
# -*- coding: UTF-8 -*-
import MySQLdb
# 打开数据库连接
db = MySQLdb.connect("localhost","root","111111","analysis2" )
# 使用cursor()方法获取操作游标
cursor = db.cursor()
cursor.execute("SET NAMES utf8")
#name = "wml' or 1 = '1"
name = "wml"
sql = "SELECT * FROM test_table WHERE name = %s"
#sql_test = "SELECT * FROM test_table WHERE name = '%s'" % (name)
try:
# 执行SQL语句,这种形式可以防止sql注入,只查询 name = 'wml' 的结果
'''
在cursor.execute() 的SQL语句中使用“%s”,而不要在SQL内直接添加参数。
如果你使用这项技术,数据库基础库将会自动添加引号,同时在必要的情况下转意你的参数。
相当于预处理操作
'''
cursor.execute(sql, name)
#这样写不具有防sql注入功能,同时查询 name = 'wml' 和 其他 的结果
#cursor.execute(sql_test)
"""
fetchone(): 该方法获取下一个查询结果集。结果集是一个对象
fetchall():接收全部的返回结果行.
rowcount: 这是一个只读属性,并返回执行execute()方法后影响的行数。
"""
#输出查询到的行数
print cursor.rowcount
#获取下一个记录列表
# for i in range(cursor.rowcount):
# row = cursor.fetchone()
# id = row[0]
# name = row[1]
# age = row[2]
# address = row[3]
# job = row[4]
# print "id=%d,name=%s,age=%s,address=%s,job=%s" % (id, name, age, address, job )
# 获取所有记录列表
results = cursor.fetchall()
for row in results:
id = row[0]
name = row[1]
age = row[2]
address = row[3]
job = row[4]
# 打印结果
print "id=%d,name=%s,age=%s,address=%s,job=%s" % (id, name, age, address, job )
except BaseException , error:
print error
# 关闭数据库连接
db.close()
2、mysql插入操作:
#!/usr/bin/python
# -*- coding: UTF-8 -*-
import MySQLdb
# 打开数据库连接
db = MySQLdb.connect("localhost","root","111111","cheyun_analysis2" )
# 使用cursor()方法获取操作游标
cursor = db.cursor()
# SQL 插入语句
#sql = "INSERT INTO test_table (name, age, address, job) VALUES ('Mac', 12, 'M', 'ie')"
#sql = "INSERT INTO test_table (name, age, address, job) VALUES ('%s', %d, '%s', '%s')" % ('aaa', 23, 'M', 'ie')
#以预处理方式操作数字类型数据时,插入失败,必须是%s类型操作才行(不知道为什么)
sql = "INSERT INTO test_table (name, age, address, job) VALUES (%s, %s, %s, %s)"
try:
# 执行sql语句,传参固定
#cursor.execute(sql)
#cursor.execute(sql)
#执行sql语句,并传参
name= 'aaa","12'
#这样传参会预处理
cursor.execute(sql, (name, '23', 'M', 'ie'))
# 提交到数据库执行
db.commit()
except BaseException, asd:
# Rollback in case there is any error
db.rollback()
#输出错误原因
print asd
# 关闭数据库连接
db.close()
3、数据库更新操作:
#!/usr/bin/python
# -*- coding: UTF-8 -*-
import MySQLdb
# 打开数据库连接
db = MySQLdb.connect("localhost","testuser","test123","TESTDB" )
# 使用cursor()方法获取操作游标
cursor = db.cursor()
# SQL 更新语句
sql = "UPDATE EMPLOYEE SET AGE = AGE + 1 WHERE SEX = '%c'" % ('M')
try:
# 执行SQL语句
cursor.execute(sql)
# 提交到数据库执行
db.commit()
except:
# 发生错误时回滚
db.rollback()
# 关闭数据库连接
db.close()
4、删除操作:
#!/usr/bin/python
# -*- coding: UTF-8 -*-
import MySQLdb
# 打开数据库连接
db = MySQLdb.connect("localhost","testuser","test123","TESTDB" )
# 使用cursor()方法获取操作游标
cursor = db.cursor()
# SQL 删除语句
sql = "DELETE FROM EMPLOYEE WHERE AGE > '%d'" % (20)
try:
# 执行SQL语句
cursor.execute(sql)
# 提交修改
db.commit()
except:
# 发生错误时回滚
db.rollback()
# 关闭连接
db.close()
5、事务:
事务机制可以确保数据一致性。
事务应该具有4个属性:原子性、一致性、隔离性、持久性。这四个属性通常称为ACID特性。
原子性:一个事务是一个不可分割的工作单位,事务中包括的诸操作要么都做,要么都不做。
一致性:事务必须是使数据库从一个一致性状态变到另一个一致性状态。一致性与原子性是密切相关的。
隔离性:一个事务的执行不能被其他事务干扰。并发执行的各个事务之间不能互相干扰。
持久性:一个事务一旦提交,它对数据库中数据的改变就应该是永久性的。接下来的其他操作或故障不应该对其有任何影响。
实例:
# SQL删除记录语句
sql = "DELETE FROM EMPLOYEE WHERE AGE > '%d'" % (20)
try:
# 执行SQL语句
cursor.execute(sql)
# 向数据库提交
db.commit()
except:
# 发生错误时回滚
db.rollback()
注意:
对于支持事务的数据库, 在Python数据库编程中,当游标建立之时,就自动开始了一个隐形的数据库事务。
commit()方法游标的所有更新操作,rollback()方法回滚当前游标的所有操作。
每一个方法都开始了一个新的事务
6、批量执行sql语句:
#coding=utf-8
import MySQLdb
conn= MySQLdb.connect(
host='localhost',
port = 3306,
user='root',
passwd='123456',
db ='test',
)
cur = conn.cursor()
#一次插入多条记录
sqli="insert into student values(%s,%s,%s,%s)"
cur.executemany(sqli,[
('3','Tom','1 year 1 class','6'),
('3','Jack','2 year 1 class','7'),
('3','Yaheng','2 year 2 class','7'),
])
cur.close()
conn.commit()
conn.close()
executemany():可以一次插入多条值,执行单挑sql语句,但是重复执行参数列表里的参数,返回值为受影响的行数。