有没办法在postgreSQL中查询oracle上的数据

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了有没办法在postgreSQL中查询oracle上的数据相关的知识,希望对你有一定的参考价值。

参考技术A 提供三个思路:
第一个:
PostgreSQL中,是可以创建各种语言写的Function的。
你可以用C写一个PostgreSQL的Function,
http://www.postgresql.org/docs/9.2/static/xfunc-c.html
在此Function中,可以试着去调用Oracle的C语言访问接口访问Oracle数据库

第二个:
与第一类似。PostgreSQL中,可以运行各种语言:如PL/pgSQL,PL/pgPerl等。
如果你安装了PL/Java
http://pljava.projects.pgfoundry.org/
http://www.slideshare.net/petereisentraut/postgresql-and-pljava
可考虑在PL/Java的Function中,通过Oracle的JDBC接口来访问Oracle。

下面的链接中非常明确地提到了一个在PostgreSQL的PL/java中访问Oracle的例子:
http://my.opera.com/myrkraverk/blog/2012/06/21/performing-sql-with-pl-java-in-postgresql

第三个:
采用DBI-Link
其简介说:
DBI-Link is a partial implementation of the SQL/MED portion of the SQL:2008 specification written in PL/Perl....

If you want to join Oracle tables from PostgreSQL on Debian GNU/Linux, you can use DBI-Link. Also, you can use PostgreSQL queries to access Oracle tables as local schemas.

DBI-Link,部分符合SQL:2008标准,
故此按照此标准你就可以在PostgreSQL中访问Oracle了。
如下的链接是在Debian Linux上的安装和使用例子:
http://www.techforce.com.br/news/linux_blog/dbi_link_to_oracle_for_postgresql_on_debian#.Ud49CflIjJA

有没有办法在熊猫数据框中运行 postgresql 查询?

【中文标题】有没有办法在熊猫数据框中运行 postgresql 查询?【英文标题】:Is there a way to run posqresql queries in a pandas dataframe? 【发布时间】:2021-04-10 22:57:14 【问题描述】:

我有这样的熊猫数据框:

created_at lat long hex_ID
0 2020-10-13 15:12:18.682905 28.690628 77.323285 883da1ab0bfffff
1 2020-10-12 22:49:05.886170 28.755408 77.112289 883da18e87fffff
2 2020-10-13 15:24:17.692375 28.690571 77.323335 883da1ab0bfffff
3 2020-10-12 23:21:13.700226 28.589922 77.082738 883da112a1fffff
4 2020-10-13 15:43:58.887592 28.649227 77.339063 883da1a941fffff

我想像这样转换它

created_at hex_id count
0 2020-10-28 22:00:00 883da11185fffff 4
1 2020-09-09 10:00:00 883da111ebfffff 2
2 2020-12-02 20:00:00 883da10769fffff 2
3 2020-10-16 07:00:00 883da111c3fffff 1
4 2020-12-13 11:00:00 883da11747fffff 4

到目前为止,我正在将数据框转储到 postgres 中并运行以下查询,然后导出数据并最后导入到我的笔记本中。

查询:

SELECT created_at('hour', timestamp),count(lat),hex_id FROM public."ML_Data"
group by created_at('hour', timestamp),hex_id

我想知道我是否可以直接在笔记本文件中进行操作

【问题讨论】:

也许看看pd.read_sql 或者你可以简单地做一个 pd.DataFrame.groupby 而不是将它转储到 postgres 中进行聚合。 @ABC 我试过 pd.read_Sql 但我不认为上面的查询会在它上面运行并且 group by 是好的,但我想要特定格式的数据框,有没有参考代码 【参考方案1】:

只需在 df 中使用 groupy。

# 2020-10-13 15:12:18.682905 -> 2020-10-13 15:00:00
df['created_at_n'] = df['created_at'].astype(str).str.split(':').str[0] + ':00:00'
df.groupby(['created_at_n', 'hex_id'])['lat'].count()

【讨论】:

【参考方案2】:

通常我使用psycopg2从postgres中获取数据,示例代码:

import psycopg2
from psycopg2 import sql

with psycopg2.connect(
        host='your_host',
        database='your_database',
        user='your_username',
        password='your_password') as con: 

    cursor = con.cursor()

    query = sql.SQL('your_query_string')
    cursor.execute(query)
    
    data = cursor.fetchall()
    data = pd.DataFrame(data, columns=col_names) # your data column names

或者我认为你可以pd.read_sql,看看这个post。

【讨论】:

让我分享一些关于我的数据的更多见解,我已经将我的笔记本连接到数据库,并使用 pycopg2 查询了数据。从中我得到 3 列 1.created_at 2.lat 3.long 从这些 lat long 使用 python 库 H3 ,我正在生成 hex_id 。 .所以这样做我得到了第一个表,现在我想将第一个表转换为提供的第二个表, 那么您可以使用 .groupby 作为@Ferris 为您提供的示例。

以上是关于有没办法在postgreSQL中查询oracle上的数据的主要内容,如果未能解决你的问题,请参考以下文章

有没有办法在熊猫数据框中运行 postgresql 查询?

获取 django 在 postgresql 上运行的所有查询

有没有办法列出 ORACLE 查询中使用的表和列? [复制]

有没有办法在 PostgreSQL 上计算数值积分?

如何(以编程方式)知道何时在 PostgreSQL/Amazon Redshift 上完成查询?

有没有办法让 Oracle 为每个查询调用重新计算查询计划?