色哟哟视频在线观看-色哟哟视频在线-色哟哟欧美15最新在线-色哟哟免费在线观看-国产l精品国产亚洲区在线观看-国产l精品国产亚洲区久久

0
  • 聊天消息
  • 系統消息
  • 評論與回復
登錄后你可以
  • 下載海量資料
  • 學習在線課程
  • 觀看技術視頻
  • 寫文章/發帖/加入社區
會員中心
电子发烧友
开通电子发烧友VIP会员 尊享10大特权
海量资料免费下载
精品直播免费看
优质内容免费畅学
课程9折专享价
創作中心

完善資料讓更多小伙伴認識你,還能領取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循環

以上的表及表中定義僅為示例,實際數據庫中會有更為復雜的關聯。




審核編輯:劉清

聲明:本文內容及配圖由入駐作者撰寫或者入駐合作網站授權轉載。文章觀點僅代表作者本人,不代表電子發燒友網立場。文章及其配圖僅供工程師學習之用,如有內容侵權或者其他違規問題,請聯系本站處理。 舉報投訴
  • 傳感器
    +關注

    關注

    2562

    文章

    52524

    瀏覽量

    763461
  • SQL
    SQL
    +關注

    關注

    1

    文章

    780

    瀏覽量

    44796
  • 數據庫
    +關注

    關注

    7

    文章

    3900

    瀏覽量

    65751
  • python
    +關注

    關注

    56

    文章

    4823

    瀏覽量

    86139

原文標題:傳感器之外—兩個數據庫之間的“連接”查詢

文章出處:【微信號:安費諾傳感器學堂,微信公眾號:安費諾傳感器學堂】歡迎添加關注!文章轉載請注明出處。

收藏 0人收藏

    評論

    相關推薦
    熱點推薦

    求助關于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 ?1747次閱讀

    數據庫查詢優化方法的研究與探索

    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 ?1017次閱讀

    python讀取數據庫數據 python查詢數據庫 python數據庫連接

    python讀取數據庫數據 python查詢數據庫 python數據庫連接 Python是一門高
    的頭像 發表于 08-28 17:09 ?2112次閱讀

    mysql怎么新建一個數據庫

    mysql怎么新建一個數據庫 如何新建一個數據庫在MySQL中 創建一個數據庫是MySQL中的基本操作之一。下面將詳細介紹在MySQL中如何新建一個數據庫。 在MySQL中創建
    的頭像 發表于 12-28 10:01 ?1158次閱讀

    Looker Studio連接器:一個連接器從多個數據庫和云應用獲取數據

    本地數據連接器 通過 Skyvia Agent 應用程序輕松將 Looker Studio(前身為 Google Data Studio)連接到本地數據庫。無需將
    的頭像 發表于 01-03 09:07 ?506次閱讀
    Looker Studio<b class='flag-5'>連接器</b>:一個<b class='flag-5'>連接器</b>從多<b class='flag-5'>個數據庫</b>和云應用獲取<b class='flag-5'>數據</b>
    主站蜘蛛池模板: 国产精品毛片AV久久97 | 妈妈的朋友5在线观看免费完整版中文 | 暖暖 视频 免费 高清 在线观看 | 婷婷五月久久丁香国产综合 | 欧美一第一页草草影院 | 杨幂视频1分11未删减在线观看 | 亚洲精品成人无码区一在线观看 | 午夜想想爱 | vidosgratis tv少女| 精品一二三区久久AAA片 | 美女18毛片免费视频 | 爽死你个放荡粗暴小淫货漫画 | 全免费A敌肛交毛片免费懂色AV | 啦啦啦 中国 日本 高清 在线 | 免费夜色污私人影院网站 | 我们日本在线观看免费动漫下载 | FREEHDXXXX学生妹 | 国产又黄又粗又爽又色的视频软件 | 97超碰97资源在线观看视频 | 肉多荤文高h羞耻校园 | 亚洲中文无码亚洲人在线观看- | 蜜桃视频无码区在线观看 | 蜜桃成熟时2在线观看完整版hd | 伊人亚洲AV久久无码精品 | BT7086福利二区最新 | 日本伦子欲 | 日日夜夜噜噜 | 撕开美女的衣服2 | 三级电影免费看 | 肉动漫无修在线播放 | 国产亚洲精品AV麻豆狂野 | 秋葵app秋葵官网18在线观看 | 浪小辉军警服务员VIDEOS | 黑丝女仆恋上我 | 美女拔萝卜| 亚洲成av人影院 | 538视频这里只有精品 | 18禁黄无遮挡禁游戏在线下载 | 97在线精品视频 | 人妖和美女玩 | 他揉捏她两乳不停呻吟口述 |

    電子發燒友

    中國電子工程師最喜歡的網站

    • 2931785位工程師會員交流學習
    • 獲取您個性化的科技前沿技術信息
    • 參加活動獲取豐厚的禮品