将数据导入Oracle,并用python获取Oracle数据
(新手上路,不对的地方请多包涵)
背景
最近在和导师做华南地区的气象预测项目。之前获取华南各个站点的实况数据都是从别人提取出来的Excel表格中直接读取的,但是如果数据库有更新,Excel表格没有及时更新,就会造成一些不便。所以最近导师让我自己学习从Oracle中读取实况数据。
下面都是我在本地测试的结果。
环境 :
windows10 , python–3.7.3, Oracle 11g, PLsql 12
Oracle11g和PLsql 12的安装就不介绍了,教程很多。
利用PLsql将表格导入Oracle
你也可以自己在Oracle中创建一个表格用来测试,或者和我一样利用PLsql将一个表格导入Oracle,都可以,我们的关键是如何利用python连接Oracle。
首先,准备好你要导入的表格
然后将它另存为txt文件
然后打开PLsql,选择工具这一栏,然后点击文本导入器
然后打开你要导入的文件,我们选择刚刚保存的txt文件,将它打开,就是下图的效果。记得将"标题名"勾上对号,具体原因我没有细看,如果你想了解可以去查阅其它资料。
下面点击“到Oracle的数据”
然后选择你的Oracle用户,也就是所有者,我的是SYSTEM,然后选择你要把这些文本数据导入到哪个表中。如果没有事先准备好的表,我们就需要新建一个。
打开windows的命令行,输入sqlplus,然后登录到Oracle
然后创建一个表,下面是我创建的表
然后我们再回到PLsql,把表选为刚刚创建的表,然后在下面选择好你要导入的数据的字段和你创建表的字段的对应关系,比如我创建的表,site就对应了导入数据的site,lat就对应了导入数据的lat列,依次类推,当然你也可以让你的site对应要导入数据的lat,这个随意。
最后点击导入就可以了。然后我们从Oracle中查看
我们会发现数据已经导入进来了。
用python从Oracle中读数据
**1.**下面就是用python去连接Oracle了。
首先,我们需要cx_Oracle库,这个直接在Anaconda的命令行用pip就可以安装。
**2.**然后就是读取的代码了
首先,我有一个utils库,这里面有我Oracle的用户名,密码,还有数据库实例名,你也可以自己建一个utils库存放自己的信息。
下面来讲一下cx_Oracle的简单用法
先是连接上Oracle
connection = cx_Oracle.connect(user, password, dsn)
user,password都是str类型,dsn的形式是’Localhost : port/sid’
Localhost如果你的Oracle安装在本地,你就可以直接用127.0.0.1,port就是你的Oracle对应的端口号,sid就是你的表所在数据库的实例名。
那么如何查看自己Oracle使用的是哪个端口呢?在你的Windows命令行输入如下命令,就能得到你想要的信息了。
lsnrctl status
那么如何获取数据库的实例名呢,首先登陆上你的Oracle,然后使用如下命令,就可以了。
select instance_name from v$instance;
**3.**然后获取游标
cursor = connection.cursor()
然后就可以使用Oracle的语句了,想让语句生效还要使用下面的函数,这里需要注意的一点是,如果你有一系列迭代数据,不要用list要改为tuple,比如我的station_list如果用的是list它就会报错,而如果改为tuple就可以运行。
sql = """select * from {table} where {element} in {station_list}""".format(table = 'stations', element = 'site', station_list = str(HN_num))
cursor.execute(sql)
生效后,就可以获得我们想要的内容了
datas = cursor.fetchall()
最后别忘了关闭游标
cursor.close()
**4.**完整的代码在下面,不过这个代码你们是跑不通的,你们需要改用自己的文件,还有Oracle用户名,密码等等信息,但是我可以给你们看看我的结果。
import cx_Oracle
import os
from utils import user, password, dsn
import pandas as pd
HN_path = 'D:\气象预测\climate_data\station_data\HN_stations.txt'
HN_num = []
def get_Station() :
with open(HN_path, 'r') as f:
lines = f.readlines()
for line in lines :
station = line[ : -1]
if station is not '':
HN_num.append(station)
continue
f.close()
if os.path.exists(HN_path) :
print("{} is found\n".format(HN_path))
get_Station()
else :
print('{} not found'.format(HN_path))
HN_num = tuple(HN_num)
connection = cx_Oracle.connect(user, password, dsn)
cursor = connection.cursor()
sql = """select * from {table} where {element} in {station_list}""".format(table = 'stations', element = 'site', station_list = str(HN_num))
cursor.execute(sql)
datas = cursor.fetchall()
cursor.close()
result = pd.DataFrame(datas, columns = ['site', 'lan', 'lon', 'altiude', 'name'])
print(result)