Python数据库编程
Python数据库编程
Python数据库API核心
数据库模块通常会提供一个connect()函数,该函数用于连接数据库,并返回数据库连接对象。而数据库连接对象通常会具有如下方法和属性 。
- cursor(factory=Cursor):打开游标
- commit():提交事务
- rollback():回滚事务
- close(): 关闭数据库连接
- isolation_level :返回或设置数据库连接中事务的隔离级别
- in_transaction:判断当前是否处于事务中
在上面这些方法中最核心的方法属于第一个,它可以返回一个游标对象而游标对象是Python操作数据库API的核心对象,我们通过它来执行一系列SQL语句。游标对象通常有如下方法和属性:
- execute(sql[, parameters]): 执行 SQL 语句。parameters 参数用于为 SQL 语句中的参数指定值
- executescript(sql script):这不是 DB API 2.0 的标准方法。该方法可以直接执行包含多条 SQL 语句的 SQL脚本。
- fetchone(): 获取查询结果集的下一行。如果没有下一行,则返回 None。
- fetchmany( size=cursor .ainysize):返回查询结果集的下 N 行组成的列表。 如果没有更多的 数据行,则返回空列表。
- fetchall(): 返回查询结果集的全部行组成的列表。
它的方法还有很多,但是核心与数据库交互相关的就是这些。
操作Mysql数据库
1.数据库建表
# 导入访问MySQL的模块
import mysql.connector
# ①连接数据库
conn = mysql.connector.connect(
user='root',
password='32147',
host='localhost',
port='3306',
database='python',
use_unicode=True
)
# ②获取游标
c = conn.cursor()
# ③执行DDL语句创建数据表
c.execute('''create table user_tb(
user_id int primary key auto_increment,
name varchar(255),
pass varchar(255),
gender varchar(255))''')
# 执行DDL语句创建数据表
c.execute('''create table order_tb(
order_id integer primary key auto_increment,
item_name varchar(255),
item_price double,
item_number double,
user_id int,
foreign key(user_id) references user_tb(user_id) )''')
# ④关闭游标
c.close()
# ⑤关闭连接
conn.close()
2.执行增删查
# 导入访问MySQL的模块
import mysql.connector
# ①连接数据库
conn = mysql.connector.connect(
user='root',
password='32147',
host='localhost',
port='3306',
database='python',
use_unicode=True
)
# ②获取游标
c = conn.cursor()
# ③用execute()执行insert语句插入数据
c.execute('insert into user_tb values(null, %s, %s, %s)', ('孙悟空', '123456', 'male'))
c.execute('insert into order_tb values(null, %s, %s, %s, %s)', ('鼠标', '34.2', '3', 1))
conn.commit()
# ④关闭游标
c.close()
# ⑤关闭连接
conn.close()
3.执行查询语句
# 导入访问MySQL的模块
import mysql.connector
# ①连接数据库
conn = mysql.connector.connect(
user='root',
password='32147',
host='localhost',
port='3306',
database='python',
use_unicode=True
)
# ②获取游标
c = conn.cursor()
# ③调用execute()执行select语句查询数据
c.execute('select * from user_tb where user_id > %s', (2,))
# 通过游标的description属性获取列信息
for col in (c.description):
print(col[0], end='\t')
print('\n----------------------------------------')
# 直接使用for循环来遍历游标中的结果集
for row in c:
print(row[1] + '-->' + row[2])
# ④关闭游标
c.close()
# ⑤关闭连接
conn.close()
游标对象的description是只读属性,返回一个元组,每个元素对应查询结果的一列,格式为(列名, 类型, 长度, ...),代码中取col[0]仅获取列名,是快速展示查询结果表头的常用方式。
执行select后,查询结果会缓存在游标中,直接用for row in c遍历,等价于调用c.fetchone()逐行获取数据。
在这里吗c.description执行后它返回一个元组,元组里的每个元素对应查询结果的一列,类似结果如下:
(
('user_id', 3, None, 11, 11, 0, False), # 第1列(user_id)的元数据
('name', 253, None, 255, 255, 0, True), # 第2列(name)的元数据
('pass', 253, None, 255, 255, 0, True), # 第3列(pass)的元数据
('gender', 253, None, 255, 255, 0, True) # 第4列(gender)的元数据
)
所以col in c.description 遍历出来是列名排列好。
row里面是已经查询出来的数据的一条,本质上这样写和游标.fetchall() 没区别。

浙公网安备 33010602011771号