Python学习之五_字符串处理生成查询SQL

济南小老虎 / 2023-05-13 / 原文

Python学习之五_字符串处理生成查询SQL


前言

昨天想给同事讲解一下获取查询部分表核心列信息的SQL方法
也写好了一个简单文档. 但是感觉不是很优雅. 
最近两三天晚上一直在学习Python. 想将昨天的文档处理成一个工具的方式.
将查询SQL展示出来. 然后再由同事手工检查确认. 增加时间范围等处理
理论上这样能够加快处理速度. 避免过多的拼接过程. 

Python的处理过程

添加三个脚本文件
dbconnection.py 拼接数据库连接字符串使用
gettablesql.py  查询数据库, 获取表SQL使用
getsql.py       接收输入的表名, 打印这个表核心列查询SQL

需要的module主要有
sys,configparser,jaydebeapi
方法比较简单, 本着自学的态度进行学习与使用. 

dbconnection.py

# coding=utf-8

import jaydebeapi
import configparser

config = configparser.ConfigParser()
config.read('dbconnection.ini',encoding='utf-8')
def getconn(dbinstance) :
    jdbcString = config.get(dbinstance,'jdbcString')
    driverPath = config.get(dbinstance,'driverPath')
    urlString = config.get(dbinstance,'urlString')
    userName = config.get(dbinstance,'userName')
    passWord = config.get(dbinstance,'passWord')
    conn = jaydebeapi.connect(jdbcString,urlString,[userName,passWord],driverPath)
    return conn

gettablesql.py

import dbconnection
import configparser

def gettablesql (configfile,dbinfo,tablename) :

    config = configparser.ConfigParser()
    config.read(configfile,encoding='utf-8')
    conn = dbconnection.getconn(dbinfo)

    getsql = ("""
    SELECT
            LISTAGG ( COLUMN_NAME, ',')
        FROM
            user_tab_cols 
        WHERE
            table_name = upper( '"""
    + str(tablename) +
    """' ) 
            AND column_name NOT LIKE '%TIME%' 
            AND column_name NOT LIKE '%_PT' 
            AND column_name NOT LIKE '%_CHT' 
            AND column_name NOT LIKE '%_ES' 
            AND column_name NOT LIKE '%_EN' 
            AND column_name NOT LIKE '%DATE%' 
        ORDER BY
            COLUMN_NAME ASC 
    """)
    cur = conn.cursor()
    cur.execute(getsql)
    columninfo = cur.fetchall()
    getdatasql=("select " + str(columninfo)[3:-4] + " from  " + str(tablename) + " order by 1 asc" )
    return getdatasql
    cur.close()

调用函数 getsql.py

import gettablesql
import sys

tablename = sys.argv[1]
sql = gettablesql.gettablesql('dbconnection.ini','bf',tablename)
print(sql)

处理的一些说明

1. """ 表示多行字符串. 
2. 字符串建议使用 () 小括号括起来, 便于处理
3. 字符串可以使用 + 的方式进行拼接. 建议可以进行str(xxx)的方式进行显示转换. 
4. str(xxxx)[3:-4] 表示删除前面三个,最后四个字符. 
   这里正好将 oracle listagg 出来的tuple记过的前面三个多语的福浩删除掉了
5. def xxxx : 进行定义函数, return 到被调用函数就可以了. 

字符串处理的一些加深学习

之前一直使用shell 进行字符串的处理
自己也记录了非常多的shell 处理工具的命令和方式.
最近学习python 感觉更简洁和方便. 
需要多学习, 需要保持学习的能力

学习可以使你有离开的能力, 只有这样才不会总被人欺负. 
本文后面的大部分学习自:
https://baijiahao.baidu.com/s?id=1738413163267646541

1. 判断输入字符串的类型

zhaobsh = input("请输入: " )
print(zhaobsh.isalpha())

使用pycharm 可以提示出具体的判断函数
isascii
isspace
isupper
islower

2. 字符串拼接

print('-'.join(zhaobsh))  # 用来指定拼接符号,拼接出一个字符串,效率比+高
print(zhaobsh.center(100, '*'))  # 字符串居中,左右填充指定内容
print(zhaobsh.ljust(50, '*'))  # 返回一个原字符串左对齐,并使用空格填充至指定长度的新字符串。
                                 如果指定的长度小于原字符串的长度则返回原字符串。
print(zhaobsh.rjust(50, '*'))  # 它将原字符串右对齐,并使用空格填充至指定长度,并返回新的字符串。
                                 如果指定的长度小于原字符串长度,则直接返回原字符串。
print(zhaobsh.zfill(50))  # 返回指定长度的字符串,原字符串右对齐,前面填充0。

3. 查找

print(str.count('p'))  # 指定内容,在原str中出现了多少次

print(str.find('pip'))  # 包含pip,则返回开始的索引值,否则返回-1。
print(str.index('pip'))  # 包含pip,则返回开始的索引值,否则返回Exception。

print(str.rfind(' '))  # 返回参数字符串在字符串中最后一次出现的位置。没有查询到则返回-1.
print(str.rindex(' '))  # 返回参数字符串在字符串中最后一次出现的位置。没有查询到则返回Exception.

4.分隔和替换

print(str.replace(' ', '-'))  # 替换操作,str.replace()函数并不对原有的字符串进行改变。

print(str.partition(' '))  # 如果字符串包含指定的分隔符,则返回一个3元的元组,第一个为分隔符左边的子串,第二个为分隔符本身,第三个为分隔符右边的子串。
print(str.rpartition(' '))  # 类似于 partition() 方法,只是该方法是从目标字符串的末尾也就是右边开始搜索分割符。

print(str.rsplit(' '))  # 如果给出了 maxsplit,则最多进行 maxsplit 次拆分,从 最右边 开始。
print(str.split(' '))  # 分割字符串
print(str.splitlines())  # 按照行界符('\r', '\r\n', \n'等)分隔,返回一个包含各行作为元素的列表,默认不包含行界符。

print(str.lstrip('p'))  # 删除从开头开始指定的字符串,然后返回结果字符串。注意:只能从开头开始
print(str.rstrip('p'))  # 删除 string 字符串末尾的指定字符,默认为空白符,包括空格、换行符、回车符、制表符。
print(str.strip())  # 删除前后的指定字符,默认是空格

5.大小写操作

print(str.capitalize())  # 第一个字母大写,对中文无效
print(str.lower())  # 字母转为小写,只对英语有效
print(str.casefold())  # 字母转为小写,所有语言都有效,例如:德语
print(str.upper())  # 字母全部转为大写,英语有效
print(str.swapcase())  # 将字符串中的英文字母大小写互换,并返回修改后的字符串。
print(str.title())  # 将字符串中的每个单词首字母大写,其余字母小写,并返回新的字符串。

6. 判断内容

print(str.startswith('pip'))  # 判断是否以pip为开头
print(str.endswith('office'))  # 判断str是否以office结尾
print(str.isalnum())  # 如果 string 至少有一个字符并且所有字符都是字母或数字则返回 True,否则返回 False
print(str.isalpha())  # 如果 string 至少有一个字符并且所有字符都是字母则返回 True,否则返回 False
print(str.isascii())  # 如果字符串为空或字符串中的所有字符都是 ASCII,则返回 True,否则返回 False。
print(str.isdecimal())  # 如果字符串中的所有字符都是十进制字符,则返回True
print(str.isdigit())  # isdigit函数检测字符串中是否只包含数字字符。若全部是由数字字符组成的字符串,则返回True,否则返回False。isdigit函数没有参数。
print(str.isidentifier())  # 如果字符串是Python中的有效标识符,返回True。如果不是,则返回False。
print(str.islower())  # islower() 方法检测字符串是否由小写字母组成.
print(str.isupper())  # 检测字符串中所有的字母是否都为大写。
print(str.isnumeric())  # 检查字符串中是否只包含数值字符。此方法只适用于Unicode的对象。

print(str.isprintable())  # 如果字符串中的所有字符都可打印或字符串为空,则返回 True,否则返回 False。
print(str.isspace())  # 检测字符串是否只由空白字符组成。
print(str.istitle())  # 检测字符串中所有的单词拼写首字母是否为大写,且其他字母为小写。

7.其他

print(str.maketrans())#此静态方法返回一个 可供 str.translate() 使用的转换对照表。
print(str.translate())
print(str.encode(encoding='utf8', errors='strict'))  # 返回字符串编码后的数据,默认的编码是当前的字符串编码。errors为给定的不同错误处理方法。
print(str.expandtabs())  # 用空格替换\t符号
print(str.format(content='yyds'))

format_map_dict = {'content': 'yyds'}
print(str.format_map(format_map_dict))  # str.format_map(mapping) 方法仅适用于字符串格式中可变数据参数来源于字典等映射关系数据时。mapping 会被直接使用而不是复制到一个 dict。