python (Oracle数据库操作)

数据库的创建与上传数据(可上传小写的表名和字段名)

import pandas as pd
import cx_Oracle
from sqlalchemy.dialects.oracle import \
            BFILE, BLOB, CHAR, CLOB, DATE, \
            DOUBLE_PRECISION, FLOAT, INTERVAL, LONG, NCLOB, \
            NUMBER, NVARCHAR, NVARCHAR2, RAW, TIMESTAMP, VARCHAR, \
            VARCHAR2
def mapping_df_types(p_data: pd.DataFrame):
    """
    定义数据对应的类型dict
    :param p_data: pd数据
    :return:
    """
    dtypedict = {}
    for i, j in zip(p_data.columns, p_data.dtypes):
        if "object" in str(j):
            dtypedict.update({i: VARCHAR(256)})
        if "float" in str(j):
            dtypedict.update({i: NUMBER(19, 8)})
        if "int" in str(j):
            dtypedict.update({i: VARCHAR(19)})
    return dtypedict

def get_key_type_old(p_dtypedict: dict):
    """
    返回orical数据库创建表格所需 字段_类型 的格式
    :param p_dtypedict: {字段:类型}
    :return:
    """
    data = ""
    data_k = list(p_dtypedict.keys())
    data_v = list(p_dtypedict.values())
    for i in range(len(p_dtypedict)):
        if data == '':
            data = data + '(' + '"' + str(data_k[i]) + '"' + ' ' + str(data_v[i]) + ','
        elif i != len(p_dtypedict) - 1:
            data = data + '"' + str(data_k[i]) + '"' + ' ' + str(data_v[i]) + ','
        else:
            data = data + '"' + str(data_k[i]) + '"' + ' ' + str(data_v[i]) + ')'
    return data

def get_key_type(p_dtypedict: dict):
    """
    返回orical数据库创建表格所需 字段_类型 的格式
    :param p_dtypedict: {字段:类型}
    :return:
    """
    data_k = list(p_dtypedict.keys())
    data_v = list(p_dtypedict.values())
    data = '(' + ','.join(list(map(lambda x, y: '"' + str(x) + '" ' + str(y), data_k, data_v)))+ ')'
    return data

def orical_creat_table(p_tablename: str, p_dtypedict: dict):
    """
    orical中创建一个表
    :param tablename: 表名
    :param dtypedict: {key:类型}
    :return:
    """
    p_tablename = '"' + p_tablename + '"'
    sql_createTable = "create table " + p_tablename + get_key_type(p_dtypedict)
    # 执行sql语句
    cur = conn.cursor()
    cur.execute(sql_createTable)
    conn.commit()
    cur.close()


def judge_if_have_this_table(p_tablename: str):
    """
    判断当前数据库是否有对应的表名
    :param p_tablename:
    :return:
    """
    p_tablename = "'" + p_tablename + "'"
    judge_sql = "SELECT COUNT(*) FROM User_Tables WHERE table_name = " + p_tablename
    have_table = False
    # 执行sql语句
    cur = conn.cursor()
    cur.execute(judge_sql)
    result = cur.fetchone()
    if result[0] == 1:
        have_table = True
    # result=cur.fetchmany(2)
    conn.commit()
    cur.close()
    return have_table


def insert_sql_by_row(p_tablename: str):
    """
    按行插入数据
    :param p_tablename: 表名
    :return:
    """
    p_tablename = '"' + p_tablename + '"'
    cur = conn.cursor()
    keys_data = "(" + ','.join(list(map(lambda x: '"'+x+'"', list(Data.columns))))+")"
    for i in range(len(Data)):
        insert_sql = "INSERT INTO" + p_tablename + keys_data+"values"+str(tuple(list(Data.iloc[i])))
        print("insert_sql", insert_sql)
        cur.execute(insert_sql)
    conn.commit()
    cur.close()

if __name__ == '__main__':
    #################定义数据
    Data = [{"projPickId": 'b4cc5099-a510-11ec-9b80-08d23efcc353', "projPickName": "N1s2",
            "botDepth": 2, "symbolBotDepth": 1},
           {"projPickId": 'b4cc509b-a510-11ec-ae34-08d23efcc352', "projPickName": "N1s2",
            "botDepth": 4, "symbolBotDepth": 1},
           {"projPickId": 'b4cc509b-a510-11ec-ae34-08d23efcc354', "projPickName": "N1s2",
            "botDepth": 3, "symbolBotDepth": 1},
           {"projPickId": 'b4cc509b-a510-11ec-ae34-08d23efcc355', "projPickName": "N1s2",
            "botDepth": 1, "symbolBotDepth": 1}]
    
    Data = pd.DataFrame(Data)
    
    ##################获取key对应的类型
    dtypedict = mapping_df_types(Data)
    
    ##############定义数据库与表名
    conn = cx_Oracle.connect('cloud/cloud@10.1.1.76:1521/yxsd')
    tablename_ori = 'r_test_table'
    
    #################判断是否有一个表
    if_have_table = judge_if_have_this_table(tablename_ori)
    
    #####################创建一个表格(需要提前判断是否有这个表格)
    if if_have_table==False:
        orical_creat_table(tablename_ori, dtypedict)
    
    #######################按行上传数据
    insert_sql_by_row(tablename_ori)

创建数据库(create_engine和cx_Oracle)

from sqlalchemy import create_engine
self.engine = create_engine("oracle+cx_oracle://用户名:密码@主机号:1521/服务名")

如果密码里含有@,可以使用URL编码来解决此问题。URL编码将特殊字符转换为URL安全的表示形式,以避免与URL语法冲突。在Python中,可以使用urllib.parse模块中的quote函数对密码进行URL编码

from sqlalchemy import create_engine
from urllib.parse import quote
sql_password = 'password@123.0'
sql_password = quote(sql_password)
dsn = '10.1.2.191:1521/yxsd'
username = 'zncc'
# 构建连接字符串
connection_string = f"oracle+cx_oracle://{username}:{sql_password}@{dsn}"
# 创建引擎
engine = create_engine(connection_string)
def connect_oracle_database():
    sql_password = 'Yxsd@123.0'
    dsn = cx_Oracle.makedsn('10.200.0.22', 1521, service_name='cloud')
    username = 'zncc'
    conn = cx_Oracle.connect(username, sql_password, dsn)
    # 或者
    # conn = cx_Oracle.connect('zncc/"Yxsd@123.0"@10.200.0.22/cloud')

    cur = conn.cursor()
    return conn, cur

cx_oracle的demo

import cx_Oracle
class oracle_demo:
    def __init__(self):
        self.conn = self.conn_ora()
        self.tablename = '"MODULE_USAGE"'
     
    def conn_ora(self):
  		conn = cx_Oracle.connect('用户名/密码@主机号:1521/服务号')
        return conn

    def close_ora(self):
        self.conn.close()

    def insert_key(self):#增加一列
        cur = self.conn.cursor()
        sql = "alter table" + self.tablename + "add (occupyType  VARCHAR2(100))"
        cur.execute(sql)
        cur.close()

    def deldata(self, exist_id):
        cur = self.conn.cursor()
        sql = "delete from "+self.tablename + 'where "LIC_SERVICE_ID" in('+ exist_id +')'
        try:
           cur.execute(sql)
           self.conn.commit()
           cur.close()
           print("数据删除成功")
        except:
            self.conn.rollback()
            print("语句执行错误")
            cur.close()

sql语句

sql = "select * from " + db_name  # 从数据库对应文件中进行查找操作
#执行sql
data = pd.read_sql(sql, self.engine)

注:pd.read_sql要用create_engine创建数据库

读取数据库某文件的数据类型

select_db_filename1 = "'" + "DIRECTIONALSURVEY"+ "'"
sql1 = "select A.COLUMN_NAME, A.DATA_TYPE from user_tab_columns A where TABLE_NAME = " + select_db_filename1 + " order by COLUMN_ID"

读取字段名和对应的数据

select_db_filename2 = "POSITIONLOG"
sql2 = "select * from " + select_db_filename2  # 从数据库对应文件中进行查找操作
db_data2 = pd.read_sql(sql2, self.engine)  # 在读取的库中执行sql语句
db_Fieldname2 = np.array(list(map(lambda x: x.upper(), db_data2.columns)))  # 读取数据库中对应文件的字段名(第一行),数据库字段名变大写
db_values2 = db_data2.values  # 数据库中数据

json存入redis

import redis
import json

redisClient = redis.StrictRedis(host='10.1.1.xx', port=6379, db=8,decode_responses=True, charset='UTF-8', encoding='UTF-8')

json_return_data = json.dumps(pd_data)
print('从json读出的数据:\n', json.loads(json_return_data))

redisClient.set(filename, json_return_data)#存入redis
redisClient.delete(filename)#从redis删除
load = redisClient.get(filename)#从redis中获取
print("从redis读出的数据:\n", load)
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值