读取和写入数据库 pymysql模块

该博客介绍了两种Python数据库操作的实现方式。方案一是直接在代码中配置数据库连接信息,包括读取数据和写入数据的函数,支持批量写入。方案二通过外部json配置文件隔离数据库信息,提供了一个通用的数据库操作接口,使得数据库配置更改更加灵活。这两种方案都适用于Django等项目中。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

可直接复用的代码

方案一

py脚本

import pymysql
import traceback
import time

class MYSQL_INTERFACE:
    def __init__(self, ip, port, user, passwd, db_name):
        self.db = pymysql.connect(
            host=ip, 
            port=port,
            user=user, 
            passwd=passwd, 
            db=db_name, 
            charset='utf8',
            cursorclass=pymysql.cursors.DictCursor)

    # 读取数据
    def read_db(self, cmd):
        self.cursor = self.db.cursor() # 获取操作游标
        try: 
            self.cursor.execute(cmd)
            db_data = self.cursor.fetchall()
            return db_data
        except:
            self.cursor.close() # 关闭游标
            traceback.print_exc()
    
    # 写入一条数据
    def write_db(self, cmd):
        self.cursor = self.db.cursor() # 获取操作游标
        try:
            self.cursor.execute(cmd)
            self.db.commit()
        except:
            self.db.rollback() # 错误回滚
            self.cursor.close() # 关闭游标
            traceback.print_exc()
    
    # 批量写入字典数据
    def write_many_data(self, data_list, table_name):
        self.cursor = self.db.cursor() # 获取操作游标
        try:
            sql_cmd = self.generate_sql_cmd(data_list, table_name)
            self.cursor.executemany(sql_cmd, data_list)
            self.db.commit()
        except:
            self.db.rollback() # 错误回滚
            self.cursor.close() # 关闭游标
            traceback.print_exc()
    # 生成批量写入字典数据的命令
    def generate_sql_cmd(self, data_list, table_name):
        data = data_list[0]
        cols = ", ".join('`{}`'.format(k) for k in data.keys())
        val_cols = ', '.join('%({})s'.format(k) for k in data.keys())
        sql_cmd = "replace INTO {}({}) VALUES({})".format(table_name, cols, val_cols)
        return sql_cmd

    # 关闭数据库链接
    def close_db(self):
        self.cursor.close() # 关闭游标
        self.db.close() # 关闭游标



def main():
    # 链接数据库,需要配置: ip, 端口号, 用户, 密码, 数据库名
    db = MYSQL_INTERFACE('127.0.0.1', 3306, 'root', 'root', 'log_info')
    
    # 读取数据库,返回批量字典数据
    cmd = "select * from log_info_table"
    db_data = db.read_db(cmd)
    print(db_data)

    # 写入一条数据(存在主键时,replace会防止重复数据的写入)
    write_cmd = "replace into log_info_table(datatime, log_file_path) values(2,100)"
    db.write_db(write_cmd)

    # 批量写入字典数据
    data_list = [
        {"datatime":30, "log_file_path":2, "html_file_path":2, "owner":2},
        {"datatime":40, "log_file_path":20, "html_file_path":20, "owner":20},
        ]
    db.write_many_data(data_list, 'log_info_table')

    # 关闭数据库链接
    db.close_db()


if __name__ == "__main__":
    try:
        start_time = time.time()

        main()

        end_time = time.time()
        print("Program running time: {:.2f}s".format(end_time - start_time))
    except:
        traceback.print_exc()

方案二:db信息配置和代码互相隔离

同级目录下,json配置文件和python代码
在这里插入图片描述

config.json文件

{
    "log_db":{
        "ip": "127.0.0.1",
        "port": 3306,
        "user": "root",
        "passwd": "root",
        "db_name": "log_info"
    },
    "log_db1":{
        "ip": "127.0.0.1",
        "port": 3306,
        "user": "root",
        "passwd": "root",
        "db_name": "log_info"
    }
}

sql_interface.py文件

import os
import pymysql
import traceback
import time
import json


# 读写数据库
class MYSQL_INTERFACE:
    def __init__(self, ip, port, user, passwd, db_name):
        self.db = pymysql.connect(
            host=ip, 
            port=port,
            user=user, 
            passwd=passwd, 
            db=db_name, 
            charset='utf8',
            cursorclass=pymysql.cursors.DictCursor)

    # 读取数据
    def read_db(self, cmd):
        self.cursor = self.db.cursor() # 获取操作游标
        try: 
            self.cursor.execute(cmd)
            db_data = self.cursor.fetchall()
            return db_data
        except:
            self.cursor.close() # 关闭游标
            traceback.print_exc()
    
    # 写入一条数据
    def write_db(self, cmd):
        self.cursor = self.db.cursor() # 获取操作游标
        try:
            self.cursor.execute(cmd)
            self.db.commit()
        except:
            self.db.rollback() # 错误回滚
            self.cursor.close() # 关闭游标
            traceback.print_exc()
    
    # 批量写入字典数据
    def write_many_data(self, data_list, table_name):
        self.cursor = self.db.cursor() # 获取操作游标
        try:
            sql_cmd = self.generate_sql_cmd(data_list, table_name)
            self.cursor.executemany(sql_cmd, data_list)
            self.db.commit()
        except:
            self.db.rollback() # 错误回滚
            self.cursor.close() # 关闭游标
            traceback.print_exc()
    # 生成批量写入字典数据的命令
    def generate_sql_cmd(self, data_list, table_name):
        data = data_list[0]
        cols = ", ".join('`{}`'.format(k) for k in data.keys())
        val_cols = ', '.join('%({})s'.format(k) for k in data.keys())
        sql_cmd = "replace INTO {}({}) VALUES({})".format(table_name, cols, val_cols)
        return sql_cmd

    # 关闭数据库链接
    def close_db(self):
        self.cursor.close() # 关闭游标
        self.db.close() # 关闭游标


# 从json配置文件中获取db信息;以后仅需配置json文件即可
def read_config_json():
    # 当前脚本所在路径
    dir_path = os.path.split(os.path.realpath(__file__))[0]
    config_file = os.path.join(dir_path, "config.json")
    with open(config_file, "r") as f:
        config_json = json.load(f)
    return config_json


"""
返回值为db对象,存在三个接口:
1、  db.read_db(cmd)  # 读取数据库的命令
2、  db.write_db(write_cmd)  # 写入数据库的命令
3、  # 批量写入字典数据
     # 参数1:批量字典数据, 数据表的名字
	 db.write_many_data(data_list, 'log_info_table')

可以在其他文件引入这个函数,去操作相应的数据库
"""
# 操作某一个数据库;参数:json配置文件的键,去链接相应的数据库
def operat_database(db_key):
    db_info = read_config_json()[db_key]
    db = MYSQL_INTERFACE(db_info["ip"], db_info["port"], db_info["user"], db_info["passwd"], db_info["db_name"])
    return db


def main():
    # 参数:操作哪个数据库(json配置文件的键)
    db = operat_database("log_db")
    # db = operat_database("log_db1")

    # 读取数据库,返回批量字典数据
    cmd = "select * from log_info_table"
    db_data = db.read_db(cmd)
    print(db_data)

    # 写入一条数据(存在主键时,replace会防止重复数据的写入)
    write_cmd = "replace into log_info_table(datatime, log_file_path) values(2,100)"
    db.write_db(write_cmd)

    # 批量写入字典数据
    data_list = [
        {"datatime":30, "log_file_path":2, "html_file_path":2, "owner":2},
        {"datatime":40, "log_file_path":20, "html_file_path":20, "owner":20},
        ]
    db.write_many_data(data_list, 'log_info_table')

    # 关闭数据库链接
    db.close_db()


if __name__ == "__main__":
    try:
        start_time = time.time()

        main()

        end_time = time.time()
        print("Program running time: {:.2f}s".format(end_time - start_time))
    except:
        traceback.print_exc()

在django内使用:
由于django项目的根路径是从项目开始的,所以直接

from common_interface.sql_interface import operat_database

就可以
在这里插入图片描述

<think>首先,用户的问题是关于如何使用PyMySQLPandas将数据写入数据库。用户说:"我想使用PyMySQLPandas将数据写入数据库 请问how to use pymysql and pandas to write data to a database",所以我需要提供指导。 系统级指令: - 所有行内数学表达式必须使用$...$格式,但用户的问题不涉及数学表达式,所以可能不需要。 - 独立公式必须使用$$...$$并单独成段,同样,这里可能不适用。 - LaTeX语法正确:确保如果使用数学,正确使用LaTeX。 - 使用中文回答:整个响应必须用中文。 - 生成相关问题:在回答结束后,添加一个“相关问题”部分。 - 回答中引用的段落末尾自然地添加引用标识:例如[^1]。引用是从提供的引用中来的,我需要参考它们。 提供的引用: - [^1]: 关于Python自动化数据库任务。 - [^2]: 示例Python代码,使用PandasSQLAlchemy写入MySQL。 - [^3]: 关于日期时间处理列名。 - [^4]: 关于索引列标签。 用户的问题是关于使用PyMySQLPandas,但引用[^2]使用了SQLAlchemy,而不是直接PyMySQL。我需要调整代码以使用PyMySQL。 关键点: - PyMySQL是一个Python MySQL客户端库。 - Pandas有to_sql方法,但需要SQLAlchemy引擎或SQLite连接。 - 要使用PyMySQL,我可能需要创建一个SQLAlchemy引擎,或者直接使用PyMySQL连接。 在引用[^2]中,代码使用了SQLAlchemy的create_engine,并指定了'mysql+pymysql'作为dialect。所以,PyMySQL可以作为SQLAlchemy的底层驱动。 步骤: 1. 安装必要的库:pandas, PyMySQL, SQLAlchemy(可选,但推荐)。 2. 导入模块。 3. 创建数据库连接:使用PyMySQL或通过SQLAlchemy。 4. 读取数据:使用Pandas读取CSV或其他格式。 5. 写入数据库:使用Pandas的to_sql方法。 由于用户指定了PyMySQL,我应该展示如何直接使用PyMySQL连接,或者通过SQLAlchemy。 Pandas的to_sql方法需要一个SQLAlchemy引擎或SQLite连接。对于MySQL,最好使用SQLAlchemy引擎。 在引用[^2]中,代码使用了SQLAlchemy引擎与PyMySQL。 所以,我可以基于引用[^2]提供代码。 回答结构: - 清晰、逐步解决问题。 - 使用中文。 - 确保可靠:基于标准实践。 大纲回答: 1. 介绍:简要说明如何使用PyMySQLPandas写入数据库。 2. 步骤: a. 安装库。 b. 导入模块。 c. 创建数据库连接。 d. 读取数据。 e. 写入数据库。 3. 提供示例代码。 4. 解释代码。 5. 添加相关问题。 在末尾添加引用标识,如果引用内容。 例如,在解释时,如果提到引用中的点,添加[^2]。 最后,添加相关问题。 相关问题生成: - 基于主题:数据库操作、Pandas、PyMySQL。 - 例如: 1. 如何优化Pandas写入数据库的性能? 2. 如何处理大数据集写入数据库? 3. PyMySQLMySQLdb有什么区别? 4. 如何确保数据写入的安全性? 确保回答真实可靠:使用标准方法。 完整响应: - 开头:直接回答问题。 - 主体:逐步指导。 - 代码块:使用Markdown格式。 - 结尾:相关问题。 用中文。</think>### 如何使用PyMySQLPandas将数据写入数据库 要将数据写入数据库(如MySQL)使用PyMySQLPandas,您需要结合Pandas的数据处理能力PyMySQL数据库连接功能。Pandas的`to_sql`方法允许将DataFrame直接写入数据库表,但它需要一个SQLAlchemy引擎作为连接接口(SQLAlchemy支持PyMySQL作为底层驱动)。以下是详细步骤,基于最佳实践参考示例[^2]。整个过程分为安装库、导入模块、建立连接、读取数据、写入数据库等步骤。我会用清晰的中文解释,并提供完整示例代码。 #### 步骤1: 安装必要的库 首先,确保安装了所需库。使用pip安装: - `pandas`: 用于数据处理。 - `PyMySQL`: MySQL数据库连接驱动。 - `sqlalchemy`: 提供数据库引擎接口(Pandas的`to_sql`方法依赖它)。 在命令行运行: ```bash pip install pandas pymysql sqlalchemy ``` #### 步骤2: 导入Python模块Python脚本中,导入相关模块: - `pandas` 用于数据操作。 - `create_engine` 从`sqlalchemy`创建数据库引擎。 - 其他辅助模块如`os`用于文件路径。 #### 步骤3: 建立数据库连接 使用SQLAlchemy的`create_engine`函数创建引擎,并指定PyMySQL作为dialect。连接字符串格式为: ``` mysql+pymysql://用户名:密码@主机:端口/数据库名 ``` 例如,如果数据库在本地主机(localhost),端口3306,数据库名为`mydb`,用户名为`root`,密码为`147369`,则连接字符串为: ```python engine = create_engine('mysql+pymysql://root:147369@localhost:3306/mydb') ``` 这确保了PyMySQL作为底层驱动处理MySQL通信[^2]。 #### 步骤4: 读取数据到Pandas DataFrame 使用Pandas读取数据文件(如CSV、Excel)。例如,从CSV文件读取: ```python df = pd.read_csv("文件路径.csv") ``` 确保文件路径正确,并使用`sep`参数指定分隔符(如`,`)。 #### 步骤5: 将DataFrame写入数据库 使用`df.to_sql()`方法写入数据库表。关键参数: - `name`: 数据库表名。 - `con`: SQLAlchemy引擎对象。 - `if_exists`: 表存在时的处理方式(`'fail'`(默认)、`'replace'`或`'append'`)。 - `index`: 是否写入DataFrame索引(建议设为`False`,避免冗余列)。 - `dtype`: 指定列数据类型(可选,用于优化,如日期时间处理[^3])。 例如,将DataFrame写入表`my_table`,并追加数据: ```python df.to_sql('my_table', engine, if_exists='append', index=False) ``` #### 完整示例代码 以下是一个完整的Python脚本示例,基于引用[^2]修改为使用PyMySQL。它读取本地CSV文件,并将数据写入MySQL数据库: ```python # -*- coding: utf-8 -*- # 导入必要模块 import pandas as pd from sqlalchemy import create_engine # 初始化数据库连接,使用PyMySQL作为驱动 # 替换为您的数据库信息:用户名、密码、主机、端口、数据库名 engine = create_engine('mysql+pymysql://root:147369@localhost:3306/mydb') # 读取本地CSV文件(替换为您的文件路径) df = pd.read_csv("E://data.csv", sep=',') # 将DataFrame写入MySQL表,不储存index列 # if_exists='replace'表示覆盖现有表;用'append'追加数据 df.to_sql('my_table', engine, index=False, if_exists='replace') print("数据成功写入MySQL数据库!") ``` #### 代码说明 - **连接建立**:`create_engine`使用`mysql+pymysql` dialect,确保PyMySQL处理MySQL连接。这比直接PyMySQL连接更兼容Pandas[^2]。 - **数据读取**:`pd.read_csv` 读取CSV文件到DataFrame。支持其他格式如Excel(用`pd.read_excel`)。 - **写入数据库**:`to_sql`方法自动创建表结构(基于DataFrame列),并插入数据。设置`index=False`避免写入额外索引列[^4]。 - **错误处理**:添加try-except块可捕获连接或写入错误(如认证失败或表不存在)。 - **性能优化**:对于大数据集,使用`chunksize`参数分批写入(如`df.to_sql(..., chunksize=1000)`),避免内存溢出[^1]。 #### 注意事项 - **安全**:确保数据库凭据安全。不要在代码中硬编码密码;使用环境变量或配置文件。引用[^1]提到保护脚本安全的重要性,例如限制数据库权限加密连接。 - **数据类型映射**:Pandas自动推断数据类型,但日期时间列可能需要手动处理(用`dtype`参数指定,如`dtype={'date_column': DATETIME}`)[^3]。 - **表结构**:如果表已存在,`if_exists='append'`追加数据;`'replace'`删除旧表重建。确保列名数据类型匹配,避免错误。 通过这个方法,您可以高效自动化数据写入任务,节省手动导出时间,并确保数据一致性[^1]。如果您有具体数据或数据库细节,我可以进一步优化代码。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值