Python连接MongoDB
安装
首先要安装pymongo,用pip装一下就好了。
工具类python文件
以下直接给出我写的mongodb操作类
#!/usr/bin/env python
# -*- coding: utf-8 -*-
# @Time : 2019/12/23 14:02
# @Author : Johnathan Lin 林佳庆
"""
数据导入Mongo模块
"""
import os
import pymongo
from utils.configReader import read_mongo_config
# 设置编码
os.environ['NLS_LANG'] = 'SIMPLIFIED CHINESE_CHINA.UTF8'
def get_mongodb_collection(collection):
"""
根据配置文件和数据库和表得到表(collection)
:param database: 数据库
:param collection: 表
:return: 表的对象
"""
mongo_config = read_mongo_config()
client = pymongo.MongoClient(mongo_config['client'])
db = client[mongo_config['database']]
if mongo_config['auth'] == 'True' or mongo_config['auth'] == 'true':
db.authenticate(mongo_config['username'], mongo_config['password'])
col = db[collection]
return col
def insert_data(collection, document):
"""
将数据插入MongoDB中
:param collection:数据将插入的集合名
:param doc:数据文档
:return:无
"""
col = get_mongodb_collection(collection)
col.insert_one(document)
def insert_data_list(collection, document_list):
"""
批量插入数据到MongoDB
:param collection: 数据将插入的集合名
:param document_list: 数据文档列表
:return:
"""
col = get_mongodb_collection(collection)
col.insert_many(document_list)
def get_children_classify_id(parent_id):
"""
获取所有子孙节点
:param parent_id: 父节点ID
:return: 所有子孙节点
"""
col = get_mongodb_collection('crawler_classify')
res = col.aggregate([
{'$match': {'classify_id': parent_id}},
{'$graphLookup': {'from': 'crawler_classify', 'startWith': '$classify_id', 'connectFromField': 'classify_id',
'connectToField': 'parent_id', 'as': 'son'}}
])
res_list = []
for doc in res:
res_list.append(doc)
if len(res_list) == 0 or len(res_list[0]['son']) == 0:
return []
else:
return [classify['classify_id'] for classify in res_list[0]['son']]
def get_document_by_condition(collection, key, value):
"""
根据集合和单一条件查找匹配的文档
:param collection: 集合名
:param key: 键
:param value: 值
:return: 匹配的文档列表
"""
col = get_mongodb_collection(collection)
res = col.find({key: value})
res_list = []
for doc in res:
res_list.append(doc)
return res_list
def update_document(collection, condition_key, condition_value, updated_key, new_value):
"""
更新文档
:param collection:
:param condition_key:
:param condition_value:
:param updated_key:
:param new_value:
:return:
"""
col = get_mongodb_collection(collection)
col.update({condition_key: condition_value}, {'$set': {updated_key: new_value}})
def get_document_by_condition_list(collection, condition_list):
"""
多条件同时成立查询匹配的文档
:param collection: 集合名
:param condition_list: 条件列表(列表中的元素为{key:value}形式)
:return: 匹配的文档
"""
col = get_mongodb_collection(collection)
res = col.find({'$and': condition_list})
res_list = []
for doc in res:
res_list.append(doc)
return res_list
def remove_document(collection, condition_list):
"""
删除文档
:param collection: 删除文档的集合
:param condition_list:
:return:
"""
col = get_mongodb_collection(collection)
col.remove({'$and': condition_list})
def update_document_condition_list_and_new_value_obj(collection, condition_list, new_value_obj):
"""
更新update文档,通过多个用“&”连接的条件和新对象更新
:param collection: 集合
:param condition_list: 与条件的列表
:param new_value_obj: 要更新的新值对象
:return:
"""
col = get_mongodb_collection(collection)
col.update({'$and': condition_list}, {'$set': new_value_obj})
配置文件
配置文件长这样:
[CONFIG]
client=mongodb://localhost:27017/
auth=False
username=xxx
password=xxx
database=yyy
获取集合
我们以 get_mongodb_collection(collection)函数为例:
def get_mongodb_collection(collection):
"""
根据配置文件和数据库和表得到表(collection)
:param database: 数据库
:param collection: 表
:return: 表的对象
"""
mongo_config = read_mongo_config()
client = pymongo.MongoClient(mongo_config['client'])
db = client[mongo_config['database']]
if mongo_config['auth'] == 'True' or mongo_config['auth'] == 'true':
db.authenticate(mongo_config['username'], mongo_config['password'])
col = db[collection]
return col
在使用Mongo的时候,我们需要先获取其Mongo服务器地址,也就是上文配置文件的client字段内的内容,通过pymongo.MongoClient()方法获取其服务器对象
然后,使用client[‘数据库名’]选择一个数据库,但选中的数据库可能需要验证用户名密码,所以如果需要验证,则使用db.authenticate(用户名,密码)验证;
最后,用db[‘集合名’]取出对应的集合即可使用了。
使用
可以发现,在python里使用mongo,用法和直接敲mongoDB脚本差不多,但是也存在一些不同,比如说‘$and’必须是字符串。
Python连接Oracle
pip装 cx-Oracle(这里注意,会有很多双胞胎几胞胎兄弟,认准这个带横杠的,后面O大写的)。
这是我之前写的python调用oracle。
import cx_Oracle
from utils.dataOperator import insert_data
def start():
conn = cx_Oracle.connect('oracle用户名/oracle密码@IP地址:端口号/oracle用户')
parent_id = '6c9da9e2b17b4e1da967f2fdfa05d89a'
sql = 'select * from 一个表的名字 start with CLASSIFY_ID = \'' + parent_id + '\'connect by prior classify_id = parent_id order by seq'
cur = conn.cursor()
cur.execute(sql)
result_list = cur.fetchall()
for result in result_list:
res_obj = {}
res_obj['classify_id'] = str(result[0])
# 一顿操作。。。。
# 在此不表
insert_data('数据库名', '集合名', res_obj)
使用cx_Oracle.connect(注意这里cx_Oracle是下划线了)调用方法,参数是oracle连接字符串
之后创建一个游标cursor,用它执行sql语句,然后用fetchAll()函数把结果拿回来就可以用了。
但具体怎么用呢?
假如CLASSIFY_ID是执行这行sql返回结果中第一列的列名,那么result[0]就是该行数据在该列的值。
所以需要多加注意。