建立数据库连接-单独连接

oracle:cx_Oracle
https://cx-oracle.readthedocs.io/en/latest/index.html
这是oracle官方开发的python操作oracle数据库的库。这个网址里大家可以看到整个库的使用教程,还可以下载pdf等版本。
# 官方给出的案例 https://cx-oracle.readthedocs.io/en/latest/user_guide/connection_handling.htmluserpwd = ". . ." # Obtain password string from a user prompt or environment variable# hr:用户名;userpwd:密码;dbhost.example.com/orclpdb1:数据库地址,例如192.168.0.1:1521/orcl。oracle的默认端口为1521,默认数据库名称orclconnection = cx_Oracle.connect("hr", userpwd, "dbhost.example.com/orclpdb1", encoding="UTF-8")
import cx_Oracle # 导入oracle操作库conn = cx_Oracle.connect("user","password","IP:1521/orcl",encoding="UTF-8")
MySQL:pymysql
https://pymysql.readthedocs.io/en/latest/
这是用于操作mysql数据库的库。从它的目录来看显得比oracle的内容少很多了。
import pymysqlconn = pymysql.connect(host="localhost",user="user",password="passwd",db="db",charset="utf-8")
sqlserver:pymssql
https://pymssql.readthedocs.io/en/latest/index.html
这是用于操作sqlserver数据库的库。
import pymssqlconn = pymssql.connect('IP','user','password','database')# 例如:conn = pymssql.connect('192.168.0.1','user','123456','dbname')
当然除了不同数据库对应的不同python库之外,还有个数据库连接库sqlalchemy可以完成对不同数据库的连接。
https://docs.sqlalchemy.org/en/13/

本篇文章主要涉及oracle和sqlserver,因此我们使用cx_Oracle和pymssql来完成python和数据库的连接。
建立数据库连接-连接池连接

利用上面的方法我们可以建立python跟数据库之间的连接,但是在进行大量的数据库操作时,单个连接可能会引发连接超时等问题。因此更好的方法是为数据库建立连接池,通过连接池中预定义好的连接进行快速数据库操作,可以消除单个连接超时问题,还可以带来以下几个好处。
较少了网络开销
系统的性能会有一个实质的提升
没了麻烦的TIME_WAIT状态
python建立连接池的方法可以使用DBUtils的PooledDB来完成。
class PooledDB(creator, # 数据库接口,上面提到的cx_Oracle、pymssql、pymysqlmincached=0, # 启动时开启的空连接数量maxcached=0, # 连接池最大可用连接数量maxshared=0, # 连接池最大可共享连接数量maxconnections=0, # 最大允许连接数量blocking=False, # 最大允许连接数量maxusage=None, # 单个连接最大复用次数setsession=None, # 用于传递到数据库的准备会话,如 [”set name UTF-8″] 。reset=True,failures=None,ping=1,*args,**kwargs)# After you have created the connection pool,# you can use connection() to get pooled,# steady DB-API 2 connectionsfrom DBUtils.PooledDB import PooledDBpool = PooledDB(cx_Oracle,mincached=2,maxconnections=6,user='user',password='123456',dsn='192.168.0.1:1521/orcl')conn = pool.connection() # 通过连接池建立连接

import cx_Oracle# 创建连接池pool = cx_Oracle.SessionPool("user", # 用户名"123456", # 密码"192.168.0.1:1521/orcl", # 数据库地址min=2, # 最小连接数max=5, # 最大连接数increment=1, # 需要建立连接时的连接数增加数,1代表每次增加1个连接encoding="UTF-8")# 从连接池获取连接connection = pool.acquire()# 通过连接创建cursor对象cursor = connection.cursor()for result in cursor.execute("select * from tablename"):print(result)# 释放连接pool.release(connection)# 关闭连接池pool.close()
cursor方法读取数据库

# 先sql = '''select *from tablename''' # 三引号可以编辑文本块with conn.cursor() as cur:cur.execute(sql) # 让数据库执行SQL语句# SQL执行后,cursor默认是在第一条数据上cur.fetchone() # 获取SQL执行后的表的一条数据。执行后cursor移动到第2条数据上。cur.fetchmany(100)# 获取SQL执行后的表的100条数据。# 此时是从第2条数据开始读取的,读到101条结束。# cursor移动到102条数据上cur.fetchall() # 获取第102及之后的所有数据cur.description # 获取SQL执行结果的列信息cur.commit() # 如果sql是insert/delet/update操作必须进行commit操作,不然操作不会入库。

column = []for i in range(len(colunms)):column.append(colunms[i][0])print(column)

import pandas as pdclass DataFrame(data=None, # 要放入DataFrame的数据,可以是2维数组、字典或者DataFrame数据index: Optional[Axes]=None, # 索引列名称columns: Optional[Axes]=None, # 各列名称dtype: Optional[Dtype]=None, # 各列数据类型copy: bool=False) #df = pd.DataFrame(data=data,columns=column)

pd.read_sql()获取数据库数据

pandas.read_sql(sql, # 要执行的sqlcon, # 数据库连接对象index_col='None', # 索引列coerce_float='True', # 是否将非字符串、非数字对象(如decimal.Decimal)的值转换为浮点值,这对SQL结果集很有用。params='None',parse_dates='None', # 要解析为date类型的数据列columns='None', # 列名称chunksize: None = 'None') # 执行SQL查询生成DataFrame,如果chunksize不为None,# 则生成可迭代的DataFrame对象,每个DataFrame块包含chunksize设置的行数的数据。# 也就是通过chunksize将SQL执行后的数据分成几块。df2 = pd.read_sql(sql,BI_conn)

read_sql_table网址:https://pandas.pydata.org/pandas-docs/stable/reference/api/pandas.read_sql_table.html#pandas.read_sql_table
直接读取数据库中的表数据放入DataFrame。读取的是整个表数据。
pd.read_sql_table("tablename",conn)read_sql_query网址:https://pandas.pydata.org/pandas-docs/stable/reference/api/pandas.read_sql_query.html#pandas.read_sql_query
读取SQL查询得到的结果数据放入DataFrame
read_sql可以看成是上面这俩方法的组合。
人生苦短,我用Python!
一切皆是信息,万物源自比特!
数字化必定会深刻革命我们的办公和生活!
简道云,中小企业数字化之路的绝佳伴侣!
本公众号将分享数字化的实践、学习、思考。也许涉及信息化系统设计、各种办公软件、数据分析、理论知识、实践案例…… 感谢你与我一同成长……
如果有关企业数字化的疑问、思考和讨论 或者 关于简道云的应用搭建、数据工厂、仪表盘等疑问咨询或者合作,欢迎与我联系。(关注公众号,可以找到我的联系方式)




