经常用到点知识,百度一下,过两天又忘,搞个笔记记一下,降低回忆成本
1. cx_Oracle (python操作oracle数据库的接口)
连接
con = cx_Oracle.connect("pythondemo","welcome","192.168.188.11:1521/std1")
con = cx_Oracle.connect(pythondemo/welcome@192.168.188.11:1521/std1)
例子
import cx_Oracle
con = cx_Oracle.connect("pythondemo/welcome@192.168.188.11:1521/std1")
cur = con.cursor()
rows = [ (1, "First" ), (2, "Second" ),
(3, "Third" ), (4, "Fourth" ),
(5, "Fifth" ), (6, "Sixth" ),
(7, "Seventh" ) ]
cur.execute("truncate table mytab")
cur.executemany("insert into mytab(id, data) values (:1, :2)", rows)
con.commit()
cur.execute('select * from mytab')
res = cur.fetchall()
print(res)
cur.close()
con.close()
2.Python批量安装第三方库脚本
BatchInstall.py
import os
libs = {"numpy","matplotlib","pillow","sklearn","requests",\
"jieba","beautifulsoup4","wheel","networkx","sympy",\
"pyinstaller","django","flask","werobot","pyqt5",\
"pandas","pyopengl","pypdf2","docopt","pygame"}
try:
for lib in libs:
os.system("pip3 install "+lib)
print("Successful")
except:
print("Failed Somehow")
3.pandas.to_sql pandas.read_sql (pandas库与数据库双向数据流通)
import pandas as pd
import cx_Oracle
con = cx_Oracle.connect("scott","tiger","192.168.188.11:1521/std1")
d = pd.read_sql('select * from test',con)
import numpy as np
import pandas as pd
a = pd.DataFrame(np.arange(10).reshape(5,2))
a
import sqlalchemy as sa
oracle_db = sa.create_engine('oracle://scott:tiger@192.168.188.11:1521/std11')
con = oracle_db.connect()
a.to_sql(name='test',con=con,if_exists='append')
4.request库通用爬虫框架
import requests
def getHTMLText(url):
try:
r = requests.get(url,timeout=30)
r.raise_for_status()
r.encoding = r.apparent_encoding
return r.text
except:
return "产生异常"
if __name__ == "__main__":
url = "https://www.cnblogs.com/yongestcat/"
print(getHTMLText(url))
5.python面向对象编程
面向对象是较函数式编程有更高的抽象层次
多态 让你无需知道对象的类型就能调用其方法
封装 让你无需知道对象的构造就可以使用它
鸭子类型 像多态一样工作,但是没有继承
属性
方法
继承
类
对象 self指向对象本身
实例化
隐藏 python没有办法设置私有属性
类的命名空间
构造函数
超类
确定一个类是否是另外一个类的子类 内置方法issubclass
知道基类 可访问__bases__属性
知道对象是否是特定类的实例,isinstance方法,不过这通常不是好做法,依赖多态在任何情况下都是更好的选择,一种重要例外是使用抽象基类和模块abc
知道对象属于哪个类 __class__属性
多个超类 多重继承 方法解析顺序
要查看对象存储的所有值 __dict__属性
抽象基类 不能被实例化
ABC模块
装饰器
文档字符串 __doc__是函数的一个属性 双下划线表示是特殊的属性
重写方法 继承机制的重要方面
构造函数__init__
析构函数__del__
super()来执行超类构造函数
6.pythonic编程
python有区别于其他语言的独有特性,利用这些特性的编程方法就是pythonic编程
7.sqlalchemy库 orm接口
SQLAlchemy是Python编程语言下的一款ORM框架,该框架建立在数据库API之上,使用关系对象映射进行数据库操作,简言之便是:将对象转换成SQL,然后使用数据API执行SQL并获取执行结果
Dialect用于和数据API进行交流,根据配置文件的不同调用不同的数据库API,从而实现对数据库的操作,如:
MySQL-Python
mysql+mysqldb://<user>:<password>@<host>[:<port>]/<dbname>
pymysql
mysql+pymysql://<username>:<password>@<host>/<dbname>[?<options>]
MySQL-Connector
mysql+mysqlconnector://<user>:<password>@<host>[:<port>]/<dbname>
cx_Oracle
oracle+cx_oracle://user:pass@host:port/dbname[?key=value&key=value...]
更多详见:http://docs.sqlalchemy.org/en/latest/dialects/index.html
使用 Schema Type/SQL Expression Language/Engine/ConnectionPooling/Dialect 进行数据库操作。Engine使用Schema Type创建一个特定的结构对象,之后通过SQL Expression Language将该对象转换成SQL语句,然后通过 ConnectionPooling 连接数据库,再然后通过 Dialect 执行SQL,并获取结果。
https://www.cnblogs.com/chen1930/p/6224676.html
import sqlalchemy as sa
oracle_db = sa.create_engine('oracle://username:password@database')
connection = oracle_db.connect()
dataframe.to_sql('table_name', connection, schema='schema_name', if_exists='append', index=False)
报错:UnicodeEncodeError: 'gbk' codec can't encode character '\xa0' in position 1: illegal multibyte sequence
该报错和一下的数据库字符集毫无关系 他么的,白折腾
select * from nls_database_parameters where parameter ='NLS_CHARACTERSET'; 或者 select userenv('language') from dual查到数据库字符集默认是US7ASCII,
电信edp用的是AMERICAN_AMERICA.ZHS16GBK
修改数据库服务器端US7ASCII为ZHS16GBK
方法1:最安全的方法是重建数据库
进入mount阶段
alter system enable restricted session
drop database
然后删除各种数据文件及对应目录即删除干净
修改配置/etc/oratab中对应部分
然后dbca选择正确的字符集重新建库
xmanager 没用一次 要关掉重新设置display等才能用第二次 不然图形界面出现各种点不动的问题
方法2:alter database character set ZHS16GBK 方式修改
但并不总是有效。该命令在Oracle8时被引入Oracle,这个操作在本质上并不转换任何数据库字符,只是简单的更新数据库中所有跟字符集相关的信息。(意味,你只能在新字符集是旧字符集严格超集的情况下使用这种方式转换。)
注意:转换字符集,数据库应该在RESTRICTED模式下进行. (使用DBA登录数据库)
shutdown immediate;
startup mount
ALTER SYSTEM ENABLE RESTRICTED SESSION;
ALTER SYSTEM SET JOB_QUEUE_PROCESSES=0;
ALTER SYSTEM SET AQ_TM_PROCESSES=0;
alter database open;
ALTER DATABASE CHARACTER SET ZHS16GBK;
常见问题:
问题1:
SQL> ALTER DATABASE CHARACTER SET ZHS16CGB231280;
ALTER DATABASE CHARACTER SET ZHS16CGB231280
*
ERROR at line 1:
ORA-12712: new character set must be a superset of old character set
或者
ERROR at line 1:
ORA-12721: operation cannot execute when other sessions are active
原因:
字符集超集问题,所谓超集是指:当前字符集中的每一个字符在新字符集中都可以表示,并使用同样的代码点,比如很多字符集都是US7ASCII的严格超集。如果不是超集,将获得以上错误。
解决方式:
SQL> alter database character set internal_use ZHS16GBK;
SQL> select * from v$nls_parameters;
SQL> SHUTDOWN IMMEDIATE;
SQL> STARTUP;
备注:
ALTER DATABASE CHARACTER SET操作的内部过程是完全相同的,也就是说INTERNAL_USE提供的帮助就是使Oracle数据库绕过了子集与超集的校验。该方法某些方面有用处,比如测试环境;应用于产品环境大家应该格外小心,除了你以外,没有人会为此带来的后果负责。
问题2:
ERROR at line 1:
ORA-12716: Cannot ALTER DATABASE CHARACTER SET when CLOB data exists
原因:
数据库存在CLOB类型字段,那么就不允许对字符集进行转换
解决方式:
这时候,我们可以去查看alert.log日志文件,看CLOB字段存在于哪些表上:
内容如:
ALTER DATABASE CHARACTER SET ZHS16GBK
SYS.METASTYLESHEET (STYLESHEET) - CLOB populated
ORA-12716 signalled during: ALTER DATABASE CHARACTER SET ZHS16GBK...
对于用户表,可以先将该表导出,然后把该表删掉,等字符转换完毕后在导入。
方法三: (最不安全的方法)
修改SYS.props$表,使用"update props$ set value$='ZHS16GBK' where name='NLS_CHARACTERSET';" 方式更改字符集时候,只是修改了 props$ 表,只完成了十几的十二分之一的内容,存在数据完整性的隐患。(value$值输入了不正确的字符集,后果可能导致数据库无法启动。)
只对更改后的数据有效,即数据库中原来的数据仍以原字符集被存储
注意:
1.修改数据库字符集时必须谨慎,修改之前一定要做数据库全量备份。(由于不能回退该项操作,因此可能会造成数据丢失或者损坏。)
2.使用 "alter database character set ZHS16GBK;" 方式更改字符集时候,至少需要更改12张数据字典表;
3.使用"update props$ set value$='ZHS16GBK' where name='NLS_CHARACTERSET';" 方式更改字符集时候,只是修改了 props$ 表,只完成了十几的十二分之一的内容,存在数据完整性的隐患。因此,更改字符集尽量使用正常的途径。
4.设置 sql_trace 跟着后台操作:在 mount 模式(SQL> STARTUP MOUNT;)下面,把会话修改为trace模式(SQL> ALTER SESSION SET SQL_TRACE=TRUE;),可以跟着数据库的后台操作。(sql_trace是DBA的常用利器之一)
5.实际上当我们更新了字符集,数据库启动时会根据数据库的字符集自动的来修改控制文件的字符集,如果字符集可以识别,更新控制文件字符集等于数据库字符集;如果字符集不可识别,那么控制文件字符集更新为US7ASCII。通过更新props$表的方式修改字符集,在Oracle7之后就不应该被使用