0
  • 聊天消息
  • 系统消息
  • 评论与回复
登录后你可以
  • 下载海量资料
  • 学习在线课程
  • 观看技术视频
  • 写文章/发帖/加入社区
会员中心
创作中心

完善资料让更多小伙伴认识你,还能领取20积分哦,立即完善>

3天内不再提示

传感器之外—两个数据库之间的“连接”查询

安费诺传感器学堂 来源:安费诺传感器学堂 2024-03-12 14:54 次阅读

年后的小编在写一些代码,没有及时更新我们的公众号,干脆,先把其中涉及到数据库的的一些操作,尤其是不同数据库,多个表的“连接”查询的操作过程小结一下供各位参考。毕竟今天这个数据时代,大量数据的处理都离不开数据库这个工具。

说到数据库,它不仅是我们大量数据有序存储的地方,更是一种提供各种数据的汇总计算、组合统计的高效工具。换句话说,就是数据库存储数据不是主要目的,更重要的是怎么使用这些数据。

当我们的重要数据要存入数据库时,一般不会把所有的数据关联的特性都定义并放到一个表里,所以会存在多个表,而存在关联的表之间在查询数据时就会产生多表连接(join)查询。

举个书店和客户用数据库的简单栗子。比如客户的信息和客户的订单。

(1)从数据保存的角度来看,完全没必要在每个订单中把客户的详细信息再跟着书本订单进行重复保存(1是影响存储空间——在我们国家有些村的地址写下了的话,可以成一本书了,2是如果客户信息有调整时,不希望把所有的订单信息也要跟着改变),所以出现了两个表;

(2)从信息输出的角度而言,当我们要了解一个订单时,却希望同时知道客户和货物书本的详情。这个时候就需要同时用到两个表的数据,对于数据库的操作就要进行多表连接查询。

表-1:Customer

CustomerID CustomerName
1 John Doe
2 Jane Doe
3 Max Smith

表-2:Order

OrderID CustomerID Book Amount
2 1 Book1 200
3 2 Book2 150
4 3 Book3 300

那么,查询订单的详情,用sql实现的方式如下:

select A.CustomerName, B.book, B.Amount from
Customer A
Left join Order B
where A.CustomerID=B.CustomerID

刚刚的sql中用到的Left Join连接查询方式,是以表Customer为主。如果在Order中没有对应客户的CustomerID,那么对应Order部分的数据在输出结果中为空(NULL)。输出结果是:

CustomerName Book Amount
John Doe Book1 200
Jane Doe Book2 150
Max Smith Book3 300

而如果上面sql用Right Join,那么以Order为主,输出的查询结果中Order部分都会输出,而Customer这部分字段如果没有对应的订单,则为空(NULL)。

如果使用Inner Join,则是以所有连接表都有对应记录的数据会随查询输出。简单的示意图如下所示。

09ad0d38-e03d-11ee-a297-92fbcf53809c.png

简单的栗子如上所述。结合题目,我们提供一下这次的情景设定:

要整合两个数据库的数据,一个是Oracle,一个是Postgresql(PG)

在PG中保存了和货物相关的信息

前者只读,后者可读写,应用要求将Oracle中的查询结果和PG中的和货物相关的表的信息进行合并

在PG中和货物相关的两个表分别是书的作者(Author),书的出版社(Publisher)

合并后的结果写入到PG的bookinfo表中

先要说明:两个独立的数据库之间是无法使用表之间的连接(join)查询的。我们直接提供解决方法:就是使用PG的临时表功能(其他数据库当然也有,物理的或者内存方式的)——TEMPLATE TABLE

基本的思路步骤如下:

查询Oracle中的数据

根据(1)的结果中的字段,在PG中建临时表

因为有了临时表,在PG中可以和其他的表进行连接查询

查询的结果再写入PG中

这里我们使用Python来实现相应的功能。示例中的表定义并不合理,大家关注的应该是实现过程。

查询Oracle的数据

importcx_Oracle#Oracle的python扩展包
importpsycopg2#PostgreSQL数据库的适配器
frompsycopg2 import extras


#Oracleconnection& cursor
oracle_connection = cx_Oracle.connect('username', 'password', 'hostname:port/servicename')
oracle_cursor = oracle_connection.cursor()


oracle_query="""
selectA.CustomerName,B.Goods,B.Amount
fromCustomerALeftjoinOrderB
whereA.CustomerID=B.CustomerID
"""


oracle_cursor.arraysize=1000       # 准备多次读取
oracle_cursor.execute(oracle_query)    # Run query


# PG的连接和cursor
# 连接到 PostgreSQL 数据库
pgsql_conn = psycopg2.connect(database="mydatabase", user="myuser", password="mypassword", host="localhost", port="5432")
pgsql_cursor = pgsql_conn.cursor()  


#准备好PG数据中插入数据的cursor和sql
#假设pg的数据库中已经建好了需要的表,这个是为例避免在下面的示例代码中
#的循环中出现这些需要额外的参数定义
#=======================================
pg_insert_query="""
"INSERTINTObook_info(
customername,bookname,amount,authorname,publishername)
VALUES(%s,%s,%s,%s,%s)"
"""
#第二个PG数据库的cursor,用于数据插入操作,以区别于连接操作的cursor
pg_insert_cursor = pgsql_conn.cursor()


#准备临时表删除用的sql
drop_table_query = "DROP TABLE IF EXISTS temp_table"
#=======================================

下面的操作都是在一个循环中完成,就不分段了。

在PG建临时表

将Oracle中查询的数据写入到PG的临时表

PG内的多表连接查询(间接的方式与Oracle查询结果进行连接查询)

将查询结果写到PG的bookinfo表中

whileTrue:
  # 通过 fetchmany 获取一批数据
  rows = oracle_cursor.fetchmany()
ifnotrows:#结束查询Oracle
    break
else:
#表中的名称和字段特性的定义需要和后面的数据插入操作一致
# 注意关键词:TEMPORARY TABLE
  pgsql_cursor.execute("""
      CREATE TEMPORARY TABLE temp_table(
      CustomerName type1,
      Book   type2,
      Amount type3
      );
    #和平时建表时相同,需要提交,每轮操作建立临时表后还需要删除
pgsql_conn.commit()

#将查询的Oracle中的数据写入临时表temp_table
#extras的使用会更高效
  extras.execute_values(
        pgsql_cursor, 
"INSERTINTOtemp_table(CustomerName,Book,Amount) VALUES %s", 
rows)
    # 提交变更
    pgsql_conn.commit()
    
#PG中多表查询,包括temp_table
SQL="""
SELECTtemp_table.*,author.name,publisher.name
fromtemp_table
leftjoinauthoronauthor.book=temp_table.book
leftjoinpublisheronpublisher.book=temp_table.book
"""

pgsql_cursor.execute(SQL)
#循环读取连接查询的结果,并保存到PG的另外一个表中:bookinfo
for rcd in pgsql_cursor:
pg_insert_cursor.execute(pg_insert_query,(rcd))

#在for循环结束后,提交数据的写入
    pgsql_conn.commit()
    
#删除临时表,准备下一次while循环
pgsql_cursor.execute(drop_table_query )
#提交变更,以删除temp_table>>>注意提交对应的execute
pgsql_conn.commit()#然后再进入下一个while循环

以上的表及表中定义仅为示例,实际数据库中会有更为复杂的关联。




审核编辑:刘清

声明:本文内容及配图由入驻作者撰写或者入驻合作网站授权转载。文章观点仅代表作者本人,不代表电子发烧友网立场。文章及其配图仅供工程师学习之用,如有内容侵权或者其他违规问题,请联系本站处理。 举报投诉
  • 传感器
    +关注

    关注

    2550

    文章

    51035

    浏览量

    753076
  • SQL
    SQL
    +关注

    关注

    1

    文章

    762

    浏览量

    44117
  • 数据库
    +关注

    关注

    7

    文章

    3794

    浏览量

    64360
  • python
    +关注

    关注

    56

    文章

    4792

    浏览量

    84627

原文标题:传感器之外—两个数据库之间的“连接”查询

文章出处:【微信号:安费诺传感器学堂,微信公众号:安费诺传感器学堂】欢迎添加关注!文章转载请注明出处。

收藏 人收藏

    评论

    相关推荐

    labvies访问数据库

    两个文件。再次运行时,LabVIEW 的功能模块就会自动加载LabSQL。3.2 LabSQL 的配置 LabSQL 与数据库之间是通过ODBC 连接,用户需要在ODBC 中指定
    发表于 08-26 10:19

    求助关于labview查询access数据库的问题

    初学者,想学习链接数据库方面的知识,遇到不少问题,下面求助各位大神,关于查询数据库的问题问题:如何通过“零部件名称”“故障模式”查询数据库
    发表于 03-14 21:18

    数据库查询

    数据库查询
    发表于 10-06 16:06

    查询数据库的最完美技巧

    查询数据库的最完美技巧.rar
    发表于 03-15 14:15 24次下载

    JAVA数据库连接:JDBC*

    实验13 数据库连接:JDBC*一、实验目的 了解JDBC核心API,利用JDBC核心API,建立数据库连接、执行SQL语句、取得查询集、
    发表于 09-23 19:06 1679次阅读

    数据库查询优化方法的研究与探索

    SQL是一种数据库查询和程序设计语言,用于存取数据以及查询、更新和管理关系数据库系统。不同的实现方法之间
    发表于 08-08 14:43 0次下载

    JAVA教程之查询数据库

    JAVA教程之查询数据库,很好的JAVA的资料,快来学习吧。
    发表于 04-12 17:49 6次下载

    KingSCADA查询数据库说明文档

    2005 数据库为例,展示在KingSCADA3.0 中怎样查询关系数据库中的信息。 以下介绍种配置数据驱动接口方式,这
    发表于 10-24 11:17 16次下载
    KingSCADA<b class='flag-5'>查询</b><b class='flag-5'>数据库</b>说明文档

    基于Greenplum数据库查询优化

    估算查询代价;然后,采用并行最大最小蚁群算法来搜索具有最小查询代价的连接顺序,即最优连接顺序;最后,根据Greenplum数据库
    发表于 03-29 17:46 0次下载

    关系型数据库表结构的设计有什么技巧?两个设计技巧详细说明

    关系型数据库表结构的设计,有下面两个设计技巧: 物理主键作为关联的外键 关系型数据库,由多个数据表构成。每一个数据表的结构是相同的,不同
    发表于 10-16 10:33 13次下载

    张表之间进行数据库查询时聚合函数用法的详细实例说明

    本文档的主要内容详细介绍的是张表之间进行数据库查询时聚合函数用法的详细实例说明。注意:表中内容中文显示时有乱码现象,我都用Hello World代替!
    发表于 04-29 18:24 0次下载
    <b class='flag-5'>两</b>张表<b class='flag-5'>之间</b>进行<b class='flag-5'>数据库</b><b class='flag-5'>查询</b>时聚合函数用法的详细实例说明

    数据库插入查询删除操作教程

    数据库插入查询删除操作教程
    发表于 12-07 09:57 2次下载

    Devart:如何通过跨多个数据库自动执行数据库脚本来节省时间和减少错误

    脚本已经成功执行,并且已经在目标数据库中创建了Users表。如果使用dbForgeStudio for SQL Server对多个数据库运行脚本,该工具将为每个数据库打开单独的SQL文档。这允许您确认
    的头像 发表于 04-06 09:49 793次阅读

    python读取数据库数据 python查询数据库 python数据库连接

    python读取数据库数据 python查询数据库 python数据库连接 Python是一门高
    的头像 发表于 08-28 17:09 1814次阅读

    mysql怎么新建一个数据库

    mysql怎么新建一个数据库 如何新建一个数据库在MySQL中 创建一个数据库是MySQL中的基本操作之一。下面将详细介绍在MySQL中如何新建一个数据库。 在MySQL中创建
    的头像 发表于 12-28 10:01 885次阅读