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() 没区别。

posted @ 2025-12-15 11:08  人生何处不青山啊  阅读(1)  评论(0)    收藏  举报