当前位置: 首页 > 编程日记 > 正文

如何用pthon连接mysql和mongodb数据库【极简版】


前言

为了巩固所学的知识,作者尝试着开始发布一些学习笔记类的博客,方便日后回顾。当然,如果能帮到一些萌新进行新技术的学习那也是极好的。作者菜菜一枚,文章中如果有记录错误,欢迎读者朋友们批评指正。

1. 连接mysql

使用 PyMySQL 连接和操作 MySQL 数据库是一个相对直接的过程。以下是一个详细的入门指南,涵盖如何安装 PyMySQL、建立连接、执行查询和关闭连接。

1.1 安装 PyMySQL

首先,您需要安装 PyMySQL 库。打开命令行(在 Windows 上是命令提示符或 PowerShell,在 macOS 或 Linux 上是终端),然后运行以下命令:

pip install pymysql

如果您使用的是 Python 3,请确保使用的是适用于 Python 3 的 PyMySQL 版本。

1.2 导入 PyMySQL

在您的 Python 脚本中,导入 PyMySQL 模块:

import pymysql

1.3 建立连接

要连接到 MySQL 数据库,您需要提供一些连接信息,包括主机名、端口号(默认为 3306)、用户名、密码和数据库名。创建一个 pymysql.connect() 对象来建立连接:

connection = pymysql.connect(
    host='localhost',  # MySQL 服务器的主机名
    port=3306,         # MySQL 服务器的端口号,默认为 3306
    user='your_username',  # 数据库的用户名
    password='your_password',  # 数据库的密码
    database='your_database'  # 要连接的数据库名
)

1.4 创建游标对象

一旦建立了连接,您就可以创建一个游标对象,该对象用于执行 SQL 语句:

with connection.cursor() as cursor:
    # 执行 SQL 语句
    cursor.execute("SELECT * FROM your_table")

1.5 执行查询

使用游标对象执行查询,并获取结果:

    # 获取查询结果
    result = cursor.fetchall()
    for row in result:
        print(row)

1.6 关闭连接

完成所有操作后,关闭连接以确保不再占用资源:

connection.close()

1.7 完整示例

将所有这些步骤放在一起,您将得到一个完整的连接和查询 MySQL 数据库的示例:

import pymysql
# 建立连接
connection = pymysql.connect(
    host='localhost',
    port=3306,
    user='your_username',
    password='your_password',
    database='your_database'
)
try:
    # 创建游标对象
    with connection.cursor() as cursor:
        # 执行查询
        cursor.execute("SELECT * FROM your_table")
        
        # 获取查询结果
        result = cursor.fetchall()
        for row in result:
            print(row)
finally:
    # 关闭连接
    connection.close()

请确保将 'your_username''your_password''your_database''your_table' 替换为您的实际 MySQL 用户名、密码、数据库名和表名。

这就是使用 PyMySQL 连接和操作 MySQL 数据库的基本步骤。当然,还有更多高级功能,如执行插入、更新和删除操作,处理事务等,但基本的连接和查询是入门的第一步。

2. 连接mongodb

使用 PyMongo 连接和操作 MongoDB 数据库是一个相对直接的过程。以下是一个详细的入门指南,涵盖如何安装 PyMongo、建立连接、执行查询和关闭连接。

2.1 安装 PyMongo

首先,您需要安装 PyMongo 库。打开命令行(在 Windows 上是命令提示符或 PowerShell,在 macOS 或 Linux 上是终端),然后运行以下命令:

pip install pymongo

如果您使用的是 Python 3,请确保使用的是适用于 Python 3 的 PyMongo 版本。

2.2 导入 PyMongo

在您的 Python 脚本中,导入 PyMongo 模块:

from pymongo import MongoClient

2.3 建立连接

要连接到 MongoDB 数据库,您需要提供 MongoDB 服务器的 URI。创建一个 MongoClient 对象来建立连接:

client = MongoClient('mongodb://localhost:27017/')

这里 'localhost:27017/' 是 MongoDB 服务器的 URI,localhost 是主机名,27017 是端口号。如果您有其他主机名或端口号,请相应地修改它们。

2.4 选择数据库和集合

一旦建立了连接,您就可以选择要操作的数据库和集合:

db = client['your_database']
collection = db['your_collection']

2.5 插入文档

使用集合来插入文档:

my_document = {
    "name": "John Doe",
    "age": 30,
    "city": "New York"
}
collection.insert_one(my_document)

2.6 查询文档

使用集合来查询文档:

for doc in collection.find():
    print(doc)

2.7 更新文档

更新集合中的文档:

update_result = collection.update_one(
    {"name": "John Doe"},
    {"$set": {"age": 31}}
)

2.8 删除文档

使用集合来删除文档:

delete_result = collection.delete_one({"name": "John Doe"})

2.9 关闭连接

完成所有操作后,关闭连接以确保不再占用资源:

client.close()

3.0 完整示例

将所有这些步骤放在一起,您将得到一个完整的连接和操作 MongoDB 数据库的示例:

from pymongo import MongoClient
# 建立连接
client = MongoClient('mongodb://localhost:27017/')
# 选择数据库和集合
db = client['your_database']
collection = db['your_collection']
# 插入文档
my_document = {
    "name": "John Doe",
    "age": 30,
    "city": "New York"
}
collection.insert_one(my_document)
# 查询文档
for doc in collection.find():
    print(doc)
# 更新文档
update_result = collection.update_one(
    {"name": "John Doe"},
    {"$set": {"age": 31}}
)
# 删除文档
delete_result = collection.delete_one({"name": "John Doe"})
# 关闭连接
client.close()

请确保将 'your_database''your_collection''John Doe' 替换为您的实际 MongoDB 数据库名、集合名和文档中的实际值。

这就是使用 PyMongo 连接和操作 MongoDB 数据库的基本步骤。当然,还有更多高级功能,如处理批量操作、使用索引、事务等,但基本的连接和操作是入门的第一步。

3.示例

3.1 需求分析

根据 id 把 mysql 数据库 sthee_gd_question_bank 表 paper_question 的 answer 字段的值插入到 mongodb 数据库中的 demo 库 question 集合的 answer 字段中

3.2 完整代码

import pymysql
from pymongo import MongoClient
from pymysql.cursors import DictCursor


class Execute:
    def __init__(self, que_cms_db_config: dict, subject_codes: [str]):
        self.que_cms_db_config = que_cms_db_config
        self.subject_codes = subject_codes

    def run(self):
        # 连接到 MySQL 数据库
        mysql_connection = pymysql.connect(**self.que_cms_db_config)

        # 执行 MySQL 操作
        with mysql_connection as connection, connection.cursor(DictCursor) as cursor:
            # 在这里添加你的 MySQL 查询
            cursor.execute('SELECT question_id, answer FROM paper_question')
            mysql_list = cursor.fetchall()

            # 添加调试打印语句
            print("MySQL Set:", mysql_list)

        # 连接到 MongoDB
        client = MongoClient(_sthee_mongo_url)
        db = client['demo']  # 这里硬编码了MongoDB的数据库名
        collection = db['question']  # 选择集合

        # 查询并保留指定字段
        mongodb_list = [{"question_id": doc["_id"], "answer": doc.get("answer", "")} for doc in
                        collection.find()]

        # 打印结果
        print("MongoDB Set:", mongodb_list)

        # 匹配比较并插入到 MongoDB
        for mysql_answer in mysql_list:
            for mongo_answer in mongodb_list:
                mongo_que_answer = mongo_answer.get('answer')
                mysql_que_answer = mysql_answer.get('answer')
                if mysql_answer['question_id'] == mongo_answer['question_id'] and (
                        mongo_que_answer is None or mongo_que_answer == '' and (
                        mysql_que_answer is not None and mysql_que_answer != '')):
                    # 如果 MongoDB 中对应的键值对为空,插入 MySQL 中的值
                    collection.update_one({"_id": mongo_answer['question_id']},
                                          {"$set": {"answer": mysql_answer['answer']}})

        # 打印最终结果
        updated_question_list = [{"question_id": doc["_id"], "answer": doc.get("answer", "")} for doc in
                                 collection.find()]
        print("Updated MongoDB Set:", updated_question_list)


if __name__ == '__main__':
    _que_cms_db_config = {
        'host': '127.0.0.1',
        'user': 'root',
        'password': 'root',
        'database': 'sthee_gd_question_bank'
    }
    _sthee_mongo_url = 'mongodb://127.0.0.1:27017'  # 这里可以是硬编码的MongoDB URI
    _subject_codes = ['00324']
    execute = Execute(
        que_cms_db_config=_que_cms_db_config,
        subject_codes=_subject_codes
    )
    execute.run()

3.3 代码分析

这段代码的主要功能是连接到MySQL和MongoDB数据库,并将MySQL数据库中的数据更新到MongoDB数据库中。以下是代码的分点分析:

  1. 类定义 Execute
    • __init__ 方法:接收MySQL数据库配置信息和学科代码列表作为参数,并将其存储为实例变量。
    • run 方法:执行实际的连接和操作。
  2. run 方法详细分析:
    • 连接到MySQL数据库:使用 pymysql.connect() 函数连接到MySQL数据库,使用 DictCursor 来返回字典类型的结果。
    • 执行MySQL操作:执行一个查询操作,选择 paper_question 表中的 question_idanswer 字段,并将结果存储在 mysql_list 中。
    • 连接到MongoDB数据库:使用 MongoClient 连接到MongoDB数据库,选择 demo 数据库和 question 集合。
    • 查询MongoDB操作:使用 collection.find() 查询MongoDB集合中的数据,并将结果存储在 mongodb_list 中。
    • 匹配比较并插入到MongoDB:遍历 mysql_listmongodb_list,比较每个元素,如果MongoDB中的对应记录的 answer 字段为空,则将MySQL中的 answer 值更新到MongoDB中。
    • 打印最终结果:打印更新后的MongoDB集合,以及原始的MongoDB和MySQL数据集。
  3. 代码中的硬编码:
    • MongoDB数据库的URI _sthee_mongo_url 和MongoDB数据库名 demo,集合名 question 都是硬编码在代码中的,这种做法不够灵活,应该通过参数传递。
  4. 代码的调试打印:
    • 在代码中使用了 print 函数来打印MySQL和MongoDB的数据集,以及更新后的MongoDB数据集,这样可以帮助开发者调试代码。
  5. MongoDB更新操作:
    • 使用 collection.update_one() 方法来更新MongoDB中的记录,如果MongoDB中的 answer 字段为空,则将MySQL中的 answer 值更新到MongoDB中。
      总结:这段代码的主要功能是连接到MySQL和MongoDB数据库,并将MySQL数据库中的数据更新到MongoDB数据库中。代码使用了 pymysqlpymongo 库来连接和操作数据库,通过匹配 question_id 和比较 answer 字段的值来实现数据的更新。

相关文章:

【Mongdb之数据同步篇】什么是Oplog、Mongodb 开启oplog,java监听oplog并写入关系型数据库、Mongodb动态切换数据源

oplog是local库下的一个固定集合,Secondary就是通过查看Primary 的oplog这个集合来进行复制的。每个节点都有oplog,记录这从主节点复制过来的信息,这样每个成员都可以作为同步源给其他节点。Oplog 可以说是Mongodb Replication的纽带了。

Windows下安装和配置Redis

下载版本Redis-x64-5.0.14.1.zip。(可能需要开代理)

ModuleNotFoundError: No module named ‘qcloud_cos‘

是腾讯云提供的一个Python SDK,用于与腾讯云对象存储(COS)服务进行交互。使用pip安装qcloud_cos报以下错误。这个错误表示Python无法找到名为。

MySQL慢查询日志slowlog

慢速查询日志记录的是执行时间超过秒和检查的行数超过的SQL语句,这些语句通常是需要进行优化的。官方参考文档:https://dev.mysql.com/doc/refman/8.0/en/slow-query-log.html。

一文搞懂MySQL索引

官方介绍索引是帮助MySQL高效获取数据的数据结构。更通俗的说,数据库索引好比是一本书前面的目录,能加快数据库的查询速度。一般来说索引本身也很大,不可能全部存储在内存中,因此索引往往是存储在磁盘上的文件中的(可能存储在单独的索引文件中,也可能和数据一起存储在数据文件中)。我们通常所说的索引,包括聚集索引、覆盖索引、组合索引、前缀索引、唯一索引等,没有特别说明,默认都是使用B+树结构组织(多路搜索树,并不一定是二叉的)的索引。看到这里,你是不是对于自己的sql语句里面的索引的有了更多优化想法呢。

ON DUPLICATE KEY UPDATE 导致mysql自增主键ID跳跃增长

具体解决方案可以根据项目来选择,如果项目不大,可以考虑1和2。如果不考虑高并发问题,可以考虑3。

mysql唯一索引与null

根据NULL的定义,NULL表示的是未知,因此两个NULL比较的结果既不相等,也不不等,结果仍然是未知。根据这个定义,多个NULL值的存在应该不违反唯一约束,所以是合理的,在oracel也是如此。在mysql 的innodb引擎中,是允许在唯一索引的字段中出现多个null值的。有上面的表和数据可以看出,查询多条数据。

详解mybatis的insert,update,delete返回值

为什么要提数据的事呢,是因为据说这个save返回的就是插入的数据的条数。但是遗憾的是,我们的这个user怎么能没有id呢,没有id有怎么查,怎么删,怎么改。进来的是没有id的user,出去的是有id的user,真是太厉害了,没想到不仅把返回值改变了,连参数都发生了改变,真是太神奇了。keyProperty=“id” 这是id就是绑定的id,那我就疑惑了,这绑定的哪个id啊。这样一搞,如果插入成功的话返回的是1,如果不成功的话返回的是-1。我让你删id是222222的,我还没创建呢,看你怎么删。

MySQL主从复制(基于binlog日志方式)

主从复制,是用来建立一个和主数据库完全一样的数据库环境,称为从数据库;主数据库一般是准实时的业务数据库。主从复制的作用1.做数据的热备,作为后备数据库,主数据库服务器故障后,可切换到从数据库继续工作,避免数据丢失。2.架构的扩展。业务量越来越大,I/O访问频率过高,单机无法满足,此时做多库的存储,降低磁盘I/O访问的频率,提高单个机器的I/O性能。3.读写分离,使数据库能支撑更大的并发。a.从服务器可以执行查询工作(就是我们常说的读功能),降低主服务器压力;(主库写,从库读,降压)

MYSQL 主从复制 --- binlog

在 Master 端并不 Care 有多少个 Slave 连上了自己,只要有 Slave 的 IO 线程通过了连接认证,向他请求指定位置之后的 Binary Log 信息,他就会按照该 IO 线程的要求,读取自己的 Binary Log 信息,返回给 Slave 的 IO 线程。默认MySQL是未开启该日志的。如果读压力加大,就需要更多的 slave 来解决,但是如果slave的复制全部从 master 复制,势必会加大 master 的复制IO的压力,所以就出现了级联复制,减轻 master 压力。

MySQL 中 is null 和 =null 的区别

如果 set ANSI_NULLS为 ON 时,表示SQL语句遵循SQL-92标准;如果 set ANSI_NULLS 为 OFF 时,表示不遵从 SQL-92 标准。但SQL-92 标准要求对null的 = 或不等于 (!= ,) 比较取值都为 false,也就是 =null 或者 null,返回的都是false。null 在MySQL中不代表任何值,通过运算符是得不到任何结果的,因此只能用 is null(默认情况)MySQL 中 null 不代表任务实际的值,类似于一个未知数。

python安装成功的图标_ubuntu下:安装anaconda、环境配置、软件图标的创建、成功启动anaconda图形界面...

Ubuntu安装anaconda常见的四大问题:目录1、介绍2、安装anaconda3、环境配置4、软件图标的创建5、成功启动anaconda图形界面1、介绍先介绍一下anaconda和python的关系:初学者所安装的python2/3只是python的环境,没有python的工具包&a…

CSS局限属性contain:优化渲染性能的利器

在网页开发中,优化渲染性能是一个重要的目标。CSS局限属性contain是一个强大的工具,可以帮助我们提高网页的渲染性能。本文将介绍contain属性的基本概念、用法和优势,以及如何使用它来优化网页的渲染过程。

配置nginx+keepalived高可用代理数据库ip端口

需求:配置nginx+keepalived高可用反向代理数据库ip端口(数据库服务器无法增加新SCAN IP或者需要隐藏数据库IP的情况下适用)本机ip为:192.168.20.10和192.168.20.11。2.任意节点关机或重启系统,浮动ip也会自动漂移到另外节点。1.任意节点停nginx:浮动ip会自动漂移到另外节点。安装依赖包和nginx和keepalived。浮动IP为:192.168.20.20。配置keepalived.conf。两台centos7.9。

Redis 击穿、穿透、雪崩产生原因解决思路

也就是在设定的时间里数据没有取出来,但是锁由过期了,常见的思路是,锁过期时间值递增,但是想想不靠谱,因为第一个请求可能超时,如果后面的也超时呢,接连多次超时之后,锁过期时间值势必特别大了,这样做弊端太多。雪崩,和击穿类似,不同的是击穿是一个热点Key某时刻失效,而雪崩是大量的热点Key在一瞬间失效,网络上很多博客都在强调解决雪崩的策略是随机过期时间,这个非常不准确,举个例子,银行做活动,之前这个利息系数为2%,过了零点系数改为3%,这种情况能将用户的对应的key改为随机过期吗?如果用的过去的数据叫脏数据。

Java中的方法重载和方法重写有什么区别?

Java中的方法重载(Overloading)和方法重写(Overriding)都是面向对象编程中的重要概念,但它们之间有一些区别。方法重载是指在同一个类中,可以定义多个具有相同名称但参数列表不同的方法。这些方法具有不同的参数类型、参数个数或参数顺序。在调用重载方法时,Java编译器会根据传递给方法的参数类型和数量来选择要调用的正确方法。方法重载主要用于解决方法的命名冲突和提高代码的可读性和可维护性。

python基础使用之变量,表达式,语句

PYTHON基础知识系列之变量、表达式、语句

python基础小知识:引用和赋值的区别

通过引用,就可以在程序范围内任何地方传递大型对象而不必在途中进行开销巨大的赋值操作。不过需要注意的是,这种赋值仅能做到顶层赋值,如果出现嵌套的情况下仍不能进行深层赋值。赋值与引用不同,复制后会产生一个新的对象,原对象修改后不会影响到新的对象。如果在原位置修改这个可变对象时,可能会影响程序其他位置对这个对象的引用

MySQL数据库查询语句之组函数,子查询语句

当一个SQL的执行需要借助另一个SQL的执行结果时,则需要进行SQL嵌套,该语法结构称之为子查询。先筛选出符合要求的数据,再对符合要求的数据进行分组时,分组的工作量会被减少,效率更高。先确定从哪张表进行操作-->对表中数据进行分组-->基于分组结果进行查询操作。执行顺序:优先执行小括号内的子SQL,根据子SQL的执行结果再执行外层SQL。执行顺序:from-->where-->group by-->select。执行顺序:from-->group by-->select。

mysql开启可以使用IP有权限访问

为实际的IP地址和你想要设置的密码。请小心操作,并确保你了解每个命令的作用。如果你对此有任何疑问,最好咨询经验丰富的数据库管理员。来设置或修改用户的密码。相反,你需要分两步来完成这个过程:首先创建或修改用户,并设置密码;然后授予相应的权限。用户应该能够从指定的内网IP地址访问MySQL服务器。用户已存在并且你只是想更改其密码或允许从另一个地址访问,使用。在MySQL 8.0及更高版本中,语句的语法有所变化。替换为你的内网IP地址,

鸿蒙harmony--数据库sqlite详解

今天是1月20号星期六,早安,岁末大寒至,静后春归来。愿他乡故人,漂泊有归宿,前程有奔赴,愿人间不寒,温暖常伴,诸事顺利,喜乐长安。

Python自动化实战之接口请求的实现

作为一位过来人也是希望大家少走一些弯路,如果你不想再体验一次学习时找不到资料,没人解答问题,坚持几天便放弃的感受的话,在这里我给大家分享一些自动化测试的学习资源,希望能给你前进的路上带来帮助。

Python中如何简化if...else...语句

我们通常在Python中采用if...else..语句对结果进行判断,根据条件来返回不同的结果,如下面的例子。这段代码是一个简单的Python代码片段,让用户输入姓名并将其赋值给变量user_input。我们能不能把这几行代码进行简化,优化代码的执行效率呢?以下是对各行代码的解读。这里使用了or这个逻辑运算符,当user_input不为空时,user_input为真,name就被赋于user_input的值。采用这种方法可以轻松实现if...else语句的简化。我们可以使用一行简短的代码来实现上面的任务。

Redis的key过期策略是怎么实现的

这是一道经典的Redis面试题,一个Redis中可能存在很多很多的key,这些key中可能有很大一部分都有过期时间,此时Redis服务器咋知道哪些key已经过期,哪些还没过期呢?如果直接遍历所有的key,这显然是行不通的,效率非常低!!Redis整体的策略是定期删除和惰性删除相结合。举个栗子:假如我去小卖铺买东西,付款的时候,发现东西过期了。就告知老板,于是老板下架此产品。消费者发现过期了,才去下架,这就叫。小卖铺老板主动定期抽取一部分商品,进行筛查,这就叫定期删除。

一键式Excel分词统计工具:如何轻松打包Python脚本为EXE

最近,表姐遇到了一个挑战:需要从Excel文件中统计出经过分词处理的重复字段,但由于数据隐私问题,这些Excel文件不能外传。这种情况下,直接使用Excel内置功能好像是行不通的,需要借助Python脚本来实现。为了解决这个问题,我写了一个简单的数据分析和自动化办公脚本,以方便使用。想象一下,即使电脑上没有安装Python,也能通过一个简单的EXE文件轻松完成工作,这是多么方便!因此,我决定不仅要写出这个脚本,还要学会如何将其打包成一个独立的EXE文件。这样,无需Python环境的电脑也能直接运行它

深入三目运算符:JavaScript、C++ 和 Python 比较

三目运算符是编程中常用的条件表达式,它允许我们根据条件选择不同的值。我们将通过具体的例子分别介绍 JavaScript、C++ 和 Python 中的三目运算符,以便更好地理解它们的用法和特性。JavaScript 示例// 例子: 根据条件选择不同的值var x = 10;var y = 20;"x 大于 y" : "x 不大于 y";在这个例子中,如果x大于y,则result的值为 “x 大于 y”,否则为 “x 不大于 y”。C++ 示例// 例子: 根据条件选择不同的值。

python实现网络爬虫代码_python如何实现网络爬虫

2、【find()】和【find_all()】方法可以遍历这个html文件,提取指定信息。return soup.find_all(string=re.compile( '百度' )) #结合正则表达式,实现字符串片段匹配。print(res) #打印输出[root@localhost demo]# python3 demo1.py。[root@localhost demo]# vim demo.py#web爬虫学习 -- 分析。r.raise_for_status() #如果状态码不是200,产生异常。

详细讲解Python中的aioschedule定时任务操作

aioschedule 是一个基于 asyncio 的 Python 库,用于在异步应用程序中进行任务调度。它提供了一种方便的方式来安排和执行异步任务,类似于传统的 schedule 库,但适用于异步编程。

雪花算法生成ID、UUID生成ID和MySql自增ID优缺点分析

综上所述,UUID适用于分布式系统和需要保密的场景,雪花ID适用于分布式系统和高并发环境,MySQL自增ID适用于单机系统和高效查询的场景。根据具体的业务需求和系统架构,选择合适的主键类型。通过本文的介绍和对比,希望读者能够更好地理解在MySQL中不推荐使用UUID或者雪花ID作为主键的原因,并能够根据实际情况做出明智的选择。在MySQL中,使用自增整数作为主键是一种常见的做法,因为它具有较小的存储空间、高效的索引和自动增长的特性。然而,具体选择何种主键类型还是要根据具体的业务需求和数据特点来决定。

【小白专用】C# 连接 MySQL 数据库

C# 连接 MySQL 数据库