pymysql的使用

mysql安装的一些命令:

sudo apt-get update
sudo apt-get install mysql-server

上面的命令将正常安装mysql:

$ mysql --version
mysql  Ver 8.0.35-0ubuntu0.20.04.1 for Linux on x86_64 ((Ubuntu))

安装成功后,首先需要启动mysql服务,才能正常的访问和使用,否则直接使用mysql -u 用户名 -p命令是无法登录的。下面是两种可用的方式:

# 直接使用mysql脚本
sudo /etc/init.d/mysql start
# 使用service命令
sudo service mysql start

mysql有一个默认的数据库用户root,如果编写代码去连接数据库的话,可能由于安全机制而无法连接。可以创建一个新的mysql用户,区别于root用户。这也是大多数情况下推荐的做法。

在python中使用pymysql操作mysql数据库,注释写的挺详细的。

# -*- coding: utf-8 -*-
"""
Created on Fri Apr 30 20:00:40 2021

@author: Team317
"""

import pymysql
'''
pymysql提供的功能已经能比较好的完成数据库操作任务了,
这里进一步将其简化,只需要提供数据,调用类中的函数就能完成任务,
省去了写sql语句的步骤,更具便捷
类中的每一个功能都可以拆分出来,根据需要可提取代码段
'''

class mysql():
## 初始化获得游标cursor,游标是关键
    def __init__(self,host,user,password,port,db=None):
        if db == None:
            self.db = pymysql.connect(host = host, user = user, password=password, port =port)
        else:
            self.db = pymysql.connect(host = host, user = user, password=password, port =port,db=db)
        # 数据库游标是必不可少的,就像文件指针一样
        self.cursor = self.db.cursor()
        # 下面的这些信息在create_a_db()中可能用得上
        self.host = host
        self.user = user
        self.password = password
        self.port = port
        
## 检查数据库版本        
    def check_version(self):
        self.cursor.execute('select version()')
        data = self.cursor.fetchone()
        print('DB version:',data)
        
## 创建数据库操作 
    # 创建一个数据库,名字为spiders
    def create_a_db(self,db):
        # connect中可以不传入db参数(数据库名称)
        self.cursor.execute("create database {db} default character set utf8".format(db=db))
        self.db = pymysql.connect(host = self.host, user = self.user, password=self.password, port = self.port, db=self.db)


## 创建表格操作
    # 在数据库中新建一个表,测试为students
    def create_a_table(self):
        # 需向connect中传入db参数,指明在哪个数据库中创建表格
        # 创建一个表格
        sql = 'create table if not exists students (id varchar(255) not null, name varchar(255) not null, \
                age int not null, primary key (id))'
        self.cursor.execute(sql)
    
## 插入操作
    # 向students中插入数据
    def add_info(self,db,id,user,age):
        sql = 'insert into students(id,name,age)values(%s,%s,%s)'
        try:
            self.cursor.execute(sql, (id,user,age))
            # 执行commit让数据同步到数据库,就像git一样
            self.db.commit()
        except:
            # 当失败时执行rollback当作没发生
            self.db.rollback()

## 插入操作增强版
    # 这个函数可以完成add_info的任务,并且具有更好的复用性
    def add_Info(self, data, table):
        # keys即为'id, name, age'
        keys = ', '.join(data.keys())
        # 当len(data)=3时,['%s']*len(data)即为['%s','%s','%s']
        values = ', '.join(['%s']*len(data))
        
        # 拼写出主键存在时更新,不存在时插入的sql语句
        # insert intostudents(id, name, age) values(%s, %s, %s) 
        sql = 'insert into {table}({keys}) values({values}) ' \
                .format(table=table,keys=keys,values=values)
        # on duplicate key updateid = %s,name = %s,age = %s
        update = 'on duplicate key update ' + ','.join(["{key} = %s".format(key=key) for key in data])
        sql += update   # 拼接sql
        
        try:
            self.cursor.execute(sql, tuple(data.values())*2)
            self.db.commit()
            print("sucess!")
        except:
            self.db.rollback()
            print("fail!")
        
## 删除操作         
    def delete_Info(self,table,condition):
        # 删除操作的sql语句
        sql = 'delete from {table} where {condition}'.format(table=table, condition = condition)
        
        try:
            self.cursor.execute(sql)
            self.db.commit()
        except:
            self.db.rollback()
## 查询操作
    def find_Info(self, table, condition):
        sql = 'select * from {table} where {condition}'.format(table=table,condition=condition)
        try:
            self.cursor.execute(sql)
            print('Count:',self.cursor.rowcount)
            row = self.cursor.fetchone()
            while row:
                print('Row:', row)
                row = self.cursor.fetchone()
        except:
            print('Error')
## 关闭操作
    def close(self):
        # 关闭数据库
        self.db.close()
        
    
if __name__ == '__main__':

    db = 'spiders'
    table = 'students'
    host = 'localhost'
    user = 'root'
    password = '1234'
    port = 3306
    SQL = mysql(host, user, password, port, db)
    
    data = {
        'id':'201200001',
        'name':'Bob',
        'age':21
    }
    SQL.add_Info(data, table)
    SQL.find_Info('students', 'age=21')
### 使用 PyMySQL 进行数据库操作 #### 安装 PyMySQL 为了使用 PyMySQL 模块,在 Python 环境中需要先安装此模块。可以利用 pip 工具来完成安装工作,命令如下所示[^4]: ```bash pip3 install pymysql ``` #### 创建数据库连接 创建与 MySQL 数据库之间的连接是进行任何数据库交互的第一步。下面是一个简单的例子展示如何建立这种连接: ```python import pymysql connection = pymysql.connect( host='localhost', user='your_username', # 替换为自己的用户名 password='your_password', # 替换为自己的密码 database='test_db' # 替换为目标数据库名称 ) try: with connection.cursor() as cursor: sql_query = "SELECT VERSION()" cursor.execute(sql_query) version = cursor.fetchone() print(f"Database version : {version}") finally: connection.close() ``` 这段代码展示了怎样安全地打开和关闭一个数据库会话,并执行一条 SQL 查询语句以获取当前使用MySQL 版本号。 #### 执行查询和其他SQL指令 一旦建立了有效的数据库连接,则可以通过 `cursor` 对象发送任意形式的标准 SQL 命令给服务器端。这里有一个更复杂的案例说明了如何插入新记录、读取多条记录以及更新现有数据: ```python with connection.cursor() as cursor: # 插入单个记录 insert_sql = 'INSERT INTO users (name, age) VALUES (%s, %s)' cursor.execute(insert_sql, ('Alice', 28)) # 提交更改 connection.commit() # 获取多个记录 select_all_users = "SELECT * FROM users" cursor.execute(select_all_users) result_set = cursor.fetchall() for row in result_set: print(row) # 更新特定条件下的记录 update_user_age = "UPDATE users SET age=%s WHERE name=%s" affected_rows = cursor.execute(update_user_age, (30, 'Bob')) print(f"{affected_rows} rows were updated.") # 删除符合条件的数据项 delete_old_records = "DELETE FROM users WHERE age>%s" deleted_count = cursor.execute(delete_old_records, (70,)) print(f"{deleted_count} old records have been removed.") # 不要忘记提交事务中的所有变更 connection.commit() ``` 以上脚本演示了几种常见类型的 CRUD(Create/Read/Update/Delete)操作方法。值得注意的是,当涉及到修改表结构或者删除大量数据时应当格外小心谨慎,最好提前做好备份措施以防万一。 #### 处理异常情况 在实际应用开发过程中不可避免会出现错误或意外状况的发生,因此编写健壮的应用程序还需要考虑这些因素。对于可能出现的问题应该采取适当的方式去捕获它们并作出响应。例如可以在 try-except 结构里加入 finally 子句确保无论发生什么都能正常释放资源。 ```python try: ... except Exception as e: print(e.args[0]) finally: if connection.open: connection.close() ``` 这样即使遇到未预见的情况也能保证不会留下悬而未决的数据库链接占用系统资源。 #### 遵循最佳实践建议 - 总是在不再需要的时候及时断开同数据库间的联系; - 将敏感信息比如账号名和密码存储于环境变量而非硬编码进源文件之中; - 利用预编译语句防止 SQL 注入攻击风险; - 合理规划每次请求返回的结果集大小以免一次性加载过多内容造成性能瓶颈;
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值