Python连接Mysql数据库操作方法

Python链接数据库的方式有几种,但是原理都是一样的,总共可以分为两个步骤,第一步是与数据库建立链接,第二步执行sql查询语句。

两种方法,第一个是pymysql.connect

1、连接数据库

import pymysql #先安装好pymysql包

db = pymysql.connect(host='localhost',user='root',password='mysql',port=3306) #通过pymysql的connect()方法声明一个连接对象db。传入host(IP)、用户名、密码、运行端口

cursor = db.cursor() #获得MySQL的操作游标,利用游标来执行SQL语句

cursor.execute('select version()')
data = cursor.fetchone() #返回单个元祖
print('Database version:',data) #打印数据库版本

cursor.execute('create database spiders default character set utf8') #创建数据库spiders
db.close()

输出如下:

2、创建表

db = pymysql.connect(host='localhost',user='root',password='mysql',port=3306,db='spiders') #连接时需要指定参数db

cursor = db.cursor()
sql = 'create table if not exists students(id varchar(255) not null,name varchar(255) not null,age int not null,primary key(id))' #爬虫中,可根据爬取结果设计特定的字段
cursor.execute(sql)
db.close()

3、插入数据

id = '20120001'
user = 'Bob'
age = 20

db = pymysql.connect(host='localhost',user='root',password='mysql',port=3306,db='spiders')

cursor = db.cursor()
sql = 'insert into students(id,name,age) values(%s,%s,%s)'
try: #异常处理
    cursor.execute(sql,(id,user,age))
    db.commit()
except:
    db.rollback()
db.close()

如果需要突然增加字段,不大改动的话,传入一个动态变化的字典:

data = {
    'id': '20120002',
    'name': 'Bob',
    'age': 20
} #根据插入的字段,动态修改
table = 'students'
keys = ', '.join(data.keys())
values = ', '.join(['%s'] * len(data))

db = pymysql.connect(host='localhost',user='root',password='mysql',port=3306,db='spiders')
cursor = db.cursor()
sql = 'INSERT INTO {table}({keys}) VALUES ({values})'.format(table=table, keys=keys, values=values)
try:
   if cursor.execute(sql, tuple(data.values())):
       print('Successful')
       db.commit()
except:
    print('Failed')
    db.rollback()
db.close()

4、更新数据

sql = 'UPDATE students SET age = %s WHERE name = %s'
try:
   cursor.execute(sql, (25, 'Bob'))
   db.commit()
except:
   db.rollback()
db.close()

5、删除数据

table = 'students'
condition = 'age > 20'

sql = 'DELETE FROM  {table} WHERE {condition}'.format(table=table, condition=condition)
try:
    cursor.execute(sql)
    db.commit()
except:
    db.rollback()

db.close()

6、查询数据

sql = 'SELECT * FROM students WHERE age >= 20'

try:
    cursor.execute(sql)
    print('Count:', cursor.rowcount) #查询结果的条数
    one = cursor.fetchone()
    print('One:', one)
    results = cursor.fetchall() #返回元祖
    print('Results:', results)
    print('Results Type:', type(results))
    for row in results:
        print(row)
except:
    print('Error')

# 将元组转化为DataFrame
df2 = pd.DataFrame(data = list(results) ,columns = ['xx', 'xx'] )
df2

可以用while循环加fetchone()方法获取所有数据(fetchall的结果以元祖形式全部返回,占用的开销会非常高)

sql = 'SELECT * FROM students WHERE age >= 20'
try:
    cursor.execute(sql)
    print('Count:', cursor.rowcount)
    row = cursor.fetchone()
    while row: #每循环一次,指针就会偏移一条数据
        print('Row:', row)
        row = cursor.fetchone() 
except:
    print('Error')

第二种方法是create_engine,在pandas框架下使用create_engine 加read_sql()方法,读取数据库文件,代码简洁,易懂,返回的是数据框

from sqlarchemy import create_engine #先安装好sqlarchemy包

#create_engine("mysql+pymysql://<username>:<password>@<host>/<dbname>[?<options>]")
# mysql:数据库类型
# pymysql:驱动器类型
# username:用户名
# password:密码
# host:数据库地址/本机使用localhost
# dbname:数据库名
# options:数据库编码格式如:charset=utf8

# 连接sample
eng = create_engine("mysql+pymysql://root:[email protected]:3306/demo?charset=utf8")

读取数据文件

import pandas as pd 
from sqlalchemy import create_engine

eng = create_engine("mysql+pymysql://zhangjian:ZhangJian*[email protected]:3306/demo?charset=gbk") 

data = pd.read_sql(sql = 'select * from orderitem limit 10',con=eng,index_col='SDate')
data
# 返回数据框结构,可以方便浏览数据

#pd.read_sql(
#sql, #完整的sql语句。也可以使用表名称,读取表中的全部数据,如data = pd.read_sql(sql = "category",con=eng)
#con, #sqlalchemy连接引擎名称
#index_col = None, #将被用作索引的名称
#columns = None #当sql参数使用的是表名称是,指定需要读入的列,使用list提供
#)

猜你喜欢

转载自blog.csdn.net/zjlamp/article/details/82469250