如何使用python连接数据库,插入并查询数据

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了如何使用python连接数据库,插入并查询数据相关的知识,希望对你有一定的参考价值。

你可以访问Python数据库接口及API查看详细的支持数据库列表。不同的数据库你需要下载不同的DB API模块,例如你需要访问Oracle数据库和mysql数据,你需要下载Oracle和MySQL数据库模块。
DB-API 是一个规范. 它定义了一系列必须的对象和数据库存取方式, 以便为各种各样的底层数据库系统和多种多样的数据库接口程序提供一致的访问接口 。
Python的DB-API,为大多数的数据库实现了接口,使用它连接各数据库后,就可以用相同的方式操作各数据库。
Python DB-API使用流程:

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

什么是MySQLdb?

MySQLdb 是用于Python链接Mysql数据库的接口,它实现了 Python 数据库 API 规范 V2.0,基于 MySQL C API 上建立的。

如何安装MySQLdb?

为了用DB-API编写MySQL脚本,必须确保已经安装了MySQL。复制以下代码,并执行:
#!/usr/bin/python
# -*- coding: UTF-8 -*-

import MySQLdb

如果执行后的输出结果如下所示,意味着你没有安装 MySQLdb 模块:
Traceback (most recent call last):
File "test.py", line 3, in <module>
import MySQLdb
ImportError: No module named MySQLdb

安装MySQLdb,请访问 ,(Linux平台可以访问:)从这里可选择适合您的平台的安装包,分为预编译的二进制文件和源代码安装包。
如果您选择二进制文件发行版本的话,安装过程基本安装提示即可完成。如果从源代码进行安装的话,则需要切换到MySQLdb发行版本的顶级目录,并键入下列命令:
$ gunzip MySQL-python-1.2.2.tar.gz
$ tar -xvf MySQL-python-1.2.2.tar
$ cd MySQL-python-1.2.2
$ python setup.py build
$ python setup.py install

注意:请确保您有root权限来安装上述模块。

数据库连接

连接数据库前,请先确认以下事项:

您已经创建了数据库 TESTDB.
在TESTDB数据库中您已经创建了表 EMPLOYEE
EMPLOYEE表字段为 FIRST_NAME, LAST_NAME, AGE, SEX 和 INCOME。
连接数据库TESTDB使用的用户名为 "testuser" ,密码为 "test123",你可以可以自己设定或者直接使用root用户名及其密码,Mysql数据库用户授权请使用Grant命令。
在你的机子上已经安装了 Python MySQLdb 模块。
如果您对sql语句不熟悉,可以访问我们的 SQL基础教程

实例:

以下实例链接Mysql的TESTDB数据库:
#!/usr/bin/python
# -*- coding: UTF-8 -*-

import MySQLdb

# 打开数据库连接
db = MySQLdb.connect("localhost","testuser","test123","TESTDB" )

# 使用cursor()方法获取操作游标
cursor = db.cursor()

# 使用execute方法执行SQL语句
cursor.execute("SELECT VERSION()")

# 使用 fetchone() 方法获取一条数据库。
data = cursor.fetchone()

print "Database version : %s " % data

# 关闭数据库连接
db.close()

执行以上脚本输出结果如下:
Database version : 5.0.45

创建数据库表

如果数据库连接存在我们可以使用execute()方法来为数据库创建表,如下所示创建表EMPLOYEE:
#!/usr/bin/python
# -*- coding: UTF-8 -*-

import MySQLdb

# 打开数据库连接
db = MySQLdb.connect("localhost","testuser","test123","TESTDB" )

# 使用cursor()方法获取操作游标
cursor = db.cursor()

# 如果数据表已经存在使用 execute() 方法删除表。
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 )"""

cursor.execute(sql)

# 关闭数据库连接
db.close()

数据库插入操作

以下实例使用执行 SQL INSERT 语句向表 EMPLOYEE 插入记录:
#!/usr/bin/python
# -*- coding: UTF-8 -*-

import MySQLdb

# 打开数据库连接
db = MySQLdb.connect("localhost","testuser","test123","TESTDB" )

# 使用cursor()方法获取操作游标
cursor = db.cursor()

# SQL 插入语句
sql = """INSERT INTO EMPLOYEE(FIRST_NAME,
LAST_NAME, AGE, SEX, INCOME)
VALUES ('Mac', 'Mohan', 20, 'M', 2000)"""
try:
# 执行sql语句
cursor.execute(sql)
# 提交到数据库执行
db.commit()
except:
# Rollback in case there is any error
db.rollback()

# 关闭数据库连接
db.close()

以上例子也可以写成如下形式:
#!/usr/bin/python
# -*- coding: UTF-8 -*-

import MySQLdb

# 打开数据库连接
db = MySQLdb.connect("localhost","testuser","test123","TESTDB" )

# 使用cursor()方法获取操作游标
cursor = db.cursor()

# SQL 插入语句
sql = "INSERT INTO EMPLOYEE(FIRST_NAME, \
LAST_NAME, AGE, SEX, INCOME) \
VALUES ('%s', '%s', '%d', '%c', '%d' )" % \
('Mac', 'Mohan', 20, 'M', 2000)
try:
# 执行sql语句
cursor.execute(sql)
# 提交到数据库执行
db.commit()
except:
# 发生错误时回滚
db.rollback()

# 关闭数据库连接
db.close()

实例:

以下代码使用变量向SQL语句中传递参数:
..................................
user_id = "test123"
password = "password"

con.execute('insert into Login values("%s", "%s")' % \
(user_id, password))
..................................

数据库查询操作

Python查询Mysql使用 fetchone() 方法获取单条数据, 使用fetchall() 方法获取多条数据。

fetchone(): 该方法获取下一个查询结果集。结果集是一个对象
fetchall():接收全部的返回结果行.
rowcount: 这是一个只读属性,并返回执行execute()方法后影响的行数。

实例:

查询EMPLOYEE表中salary(工资)字段大于1000的所有数据:
#!/usr/bin/python
# -*- coding: UTF-8 -*-

import MySQLdb

# 打开数据库连接
db = MySQLdb.connect("localhost","testuser","test123","TESTDB" )

# 使用cursor()方法获取操作游标
cursor = db.cursor()

# SQL 查询语句
sql = "SELECT * FROM EMPLOYEE \
WHERE INCOME > '%d'" % (1000)
try:
# 执行SQL语句
cursor.execute(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 "Error: unable to fecth data"

# 关闭数据库连接
db.close()

以上脚本执行结果如下:
fname=Mac, lname=Mohan, age=20, sex=M, income=2000

数据库更新操作

更新操作用于更新数据表的的数据,以下实例将 TESTDB表中的 SEX 字段全部修改为 'M',AGE 字段递增1:
#!/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()

删除操作

删除操作用于删除数据表中的数据,以下实例演示了删除数据表 EMPLOYEE 中 AGE 大于 20 的所有数据:
#!/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()

执行事务

事务机制可以确保数据一致性。

事务应该具有4个属性:原子性、一致性、隔离性、持久性。这四个属性通常称为ACID特性。

原子性(atomicity)。一个事务是一个不可分割的工作单位,事务中包括的诸操作要么都做,要么都不做。
一致性(consistency)。事务必须是使数据库从一个一致性状态变到另一个一致性状态。一致性与原子性是密切相关的。
隔离性(isolation)。一个事务的执行不能被其他事务干扰。即一个事务内部的操作及使用的数据对并发的其他事务是隔离的,并发执行的各个事务之间不能互相干扰。
持久性(durability)。持续性也称永久性(permanence),指一个事务一旦提交,它对数据库中数据的改变就应该是永久性的。接下来的其他操作或故障不应该对其有任何影响。

Python DB API 2.0 的事务提供了两个方法 commit 或 rollback。
参考技术A

我写过类似的步骤 可以参考下:

http://blog.163.com/lucia_gagaga/blog/static/2647680192016829115638888/

pymysql 模块简单使用

pymysql 模块简单使用

安装 pymysql 模块

技术图片

技术图片

技术图片

使用 pymysql 连接数据库 并插入数据

  • 数据库的写入数据流程

1.导入模块
from pymysql import connect

2.Connection 对象 目的:用于建立代码与数据库的连接
创建连接对象 conn=connect(参数列表)

    参数host:连接的mysql主机,如果本机是'127.0.0.1'#如果不能用可以试下 host=localhost
    参数port:连接的mysql主机的端口,默认是3306
    参数database:数据库的名称
    参数user:连接的用户名
    参数password:连接的密码
    参数charset:通信采用的编码方式,推荐使用utf8
    
3.关闭连接 conn.close()

4.提交数据 conn.commit()

5.撤销数据 conn.rollback()

6.通过连接获取游标 cur = conn.cursor()返回Cursor对象,用于执行sql语句并获得结果

7.Cursor游标对象 目的: 执行sql语句

8.获取Cursor对象 cur = conn.cursor()

9.使用游标执行SQL语句 cur.execute(operation , [parameters])

10.执行SQL语句,返回受影响的行数,主要用于执行insert、update、delete语句

11.获取结果集中的一条 cur.fetchone() 返回一个元组 

12.获取结果集中的一条 cur.fetchmany(2) 返回一个元组

13.获取结果集中的所有 cur.fetchall() 执行查询时,获取结果集的所有行,一行构成一个元组,再将这些元组装入一个元组返回

14.关闭游标 cur.close()

使用pymysql 插入数据

import pymysql    #导入模块
conn = pymysql.connect(host='127.0.0.1', user='root', password="318",database ='ftp')  
# host=localhost #也可以写,如果127.0.0.1不能用的话#  登录数据库
cur = conn.cursor()   # 数据库操作符 游标
cur.execute('insert into employee(emp_name,sex,age,hire_date) values ("凯歌","male",40,20190808)')
#()里填 sql 语句 注意'sql语句中的""引号要与最外为的引号区分开w'   
conn.commit()  #提交数据
cur.close()    #关闭游标
conn.close()   #断开数据库,释放资源
  • 通过cmd查询结果

技术图片

  • 查询并获取结果
#fetchone()
import pymysql
conn = pymysql.connect(host='127.0.0.1', user='root', password="318", database='ftp')
cur = conn.cursor() 
cur.execute('select * from employee where id > 10')
ret = cur.fetchone() #获取符合条件的第一个值的所有信息,返回结果类型为元组
print(ret)
cur.close()
conn.close()
##执行结果   
(11, '丁丁', 'female', 18, datetime.date(2011, 3, 12), 'sale', None, 1000.37, 402, 2)

#cur.fetchmany(数值) #()里的数值是多少,就返回几个符合条件的结果,返回结果类型为元组,
数值如果超过符合条件的的结果数量,返回会全部结果,不会报错
import pymysql
conn = pymysql.connect(host='127.0.0.1', user='root', password="318", database='ftp')
cur = conn.cursor()  
cur.execute('select * from employee where id > 10')
ret = cur.fetchmany(2)#获取符合条件的两个结果,返回结果类型为元组
print(ret)
cur.close()
conn.close()
##执行结果
((11, '丁丁', 'female', 18, datetime.date(2011, 3, 12), 'sale', None, 1000.37, 402, 2), 
(12, '星星', 'female', 18, datetime.date(2016, 5, 13), 'sale', None, 3000.29, 402, 2))

#cur.fetchall()#找到所有符合条件的结果,返回结果类型为元组
import pymysql
conn = pymysql.connect(host='127.0.0.1', user='root', password="318", database='ftp')
cur = conn.cursor()   
cur.execute('select * from employee where id > 10')
ret = cur.fetchall()
print(ret)
cur.close()
conn.close()
##执行结果
((11, '丁丁', 'female', 18, datetime.date(2011, 3, 12), 'sale', None, 1000.37, 402, 2), 
(12, '星星', 'female', 18, datetime.date(2016, 5, 13), 'sale', None, 3000.29, 402, 2), 
(13, '格格', 'female', 28, datetime.date(2017, 1, 27), 'sale', None, 4000.33, 402, 2),
 (14, '张野', 'male', 28, datetime.date(2016, 3, 11), 'operation', None, 10000.13, 403, 3), 
(15, '程咬金', 'male', 18, datetime.date(1997, 3, 12), 'operation', None, 20000.0, 403, 3), 
(16, '程咬银', 'female', 18, datetime.date(2013, 3, 11), 'operation', None, 19000.0, 403, 3), 
(17, '程咬铜', 'male', 18, datetime.date(2015, 4, 11), 'operation', None, 18000.0, 403, 3), 
(18, '程咬铁', 'female', 18, datetime.date(2014, 5, 12), 'operation', None, 17000.0, 403, 3), 
(20, '凯歌', 'male', 40, datetime.date(2019, 8, 8), None, None, None, None, None))

修改查询显示结果

  • 我们拿到的结果都是元组类型,不能让我们很好的感知数据,有什么方法能让数据更直观呢?
  • cur = conn.cursor(pymysql.cursors.DictCursor)
import pymysql
conn = pymysql.connect(host='127.0.0.1', user='root', password="318", database='ftp')
cur = conn.cursor(pymysql.cursors.DictCursor)   #把返回结果改为,字典类型,key是字段,value是数据
cur.execute('select * from employee where id > 10')
ret = cur.fetchone()
print(ret['emp_name'], ret['sex'], ret['age'], ret)
cur.close()
conn.close()

#执行结果
丁丁 female 18 'id': 11, 'emp_name': '丁丁', 'sex': 'female', 'age': 18, 'hire_date': datetime.date(2011, 3, 12), 
'post': 'sale', 'post_comment': None, 'salary': 1000.37, 'office': 402, 'depart_id': 2

以上是关于如何使用python连接数据库,插入并查询数据的主要内容,如果未能解决你的问题,请参考以下文章

面面观 | 使用python 连接数据库,插入并查询数据--link

Python使用SQLAlchemy连接数据库并创建数据表插入数据删除数据更新表查询表(CRUD)

java连接Orcale数据库并查询插入删除数据

MySQL 连接器/Python 存储过程插入未提交

如何使用 Python 连接 cPanel 内的数据库?

如何在没有连接的情况下查询多个相关表,并使用 JDBC 获得一致的数据?