精品欧美一区二区三区在线观看 _久久久久国色av免费观看性色_国产精品久久在线观看_亚洲第一综合网站_91精品又粗又猛又爽_小泽玛利亚一区二区免费_91亚洲精品国偷拍自产在线观看 _久久精品视频在线播放_美女精品久久久_欧美日韩国产成人在线

項目從 MySQL 切換 PostgreSQL,踩了太多的坑!!!

數據庫 其他數據庫
如果不想這樣,只能修改代碼的所有表對象的字段類型和傳參類型保證與postgres數據庫的字段類型對應,但是有些依賴的框架底層自己操作數據庫可能就無法修改源碼了,只能修改數據庫表字段類型了。

0、前言

原項目框架 SpringBoot + MybatisPlus + Mysql

1、切換流程

1.1、項目引入postgresql驅動包

由于我們要連接新的數據庫,理所當然的要引入該數據庫的驅動包,這與mysql驅動包類似

<dependency>
    <groupId>org.postgresql</groupId>
    <artifactId>postgresql</artifactId>
</dependency>

1.2、修改jdbc連接信息

之前用的是mysql協議,現在改成postgresql連接協議

spring:
  datasource:
    # 修改驅動類
    driver-class-name: org.postgresql.Driver
    # 修改連接地址
    url: jdbc:postgresql://數據庫地址/數據庫名?currentSchema=模式名&useUnicode=true&characterEncoding=utf8&serverTimezone=GMT%2B8&useSSL=false

postgres相比mysql多了一層模式的概念, 一個數據庫下可以有多個模式。這里的模型名等價于以前的mysql的數據庫名。如果不指定默認是public。

這時切換流程基本就改造完了,無非就是代碼修改下連接信息。但是你以為到這就結束了?

一堆坑還在后面呢,畢竟是兩個完全不同數據庫在語法層面還有很多差別,接下來就是修改代碼里的sql語法踩坑

2、踩坑記錄

2.1、TIMESTAMPTZ類型與LocalDateTime不匹配

異常信息:

PSQLException: Cannot convert the column of type TIMESTAMPTZ to requested type java.time.LocalDateTime.

如果postgres表的字段類型是TIMESTAMPTZ ,但是java對象的字段類型是LocalDateTime, 這時會無法轉換映射上。postgres表字段類型應該用timestamp 或者 java字段類型用Date

2.2、參數值不能用雙引號

錯誤例子:

WHERE name = "jay"   ===>    WHERE name = 'jay'

這里參數值"jay" 應該改成單引號 'jay'

2.3、字段不能用``包起來

錯誤例子

WHERE `name` = 'jay'  ==>    WHERE name = 'jay'

這里的字段名name不能用``選取

2.4、json字段處理語法不同

-- mysql語法: 
WHERE keywords_json->'$.name' LIKE CONCAT('%', ?, '%')

-- postgreSQL語法:
WHERE keywords_json ->>'name' LIKE CONCAT('%', ?, '%')

獲取json字段子屬性的值mysql是用 -> '$.xxx'的語法去選取的, 而 postgreSQL 得用 ->>'xx' 語法選擇屬性

2.5、convert函數不存在

postgreSQL沒有convert函數,用CAST函數替換

-- mysql語法: 
select convert(name, DECIMAL(20, 2))

-- postgreSQL語法:
select CAST(name as DECIMAL(20, 2))

2.6、force index 語法不存在

-- mysql語法
select xx FROM user force index(idx_audit_time)

mysql可以使用force index強制走索引, postgres沒有,建議去掉

2.7、ifnull 函數不存在

postgreSQL沒有ifnull函數,用COALESCE函數替換

異常信息

cause: org.postgresql.util.PSQLException: ERROR: function ifnull(numeric, numeric) does not exist

2.8、date_format 函數不存在

異常信息

Cause: org.postgresql.util.PSQLException: ERROR: function date_format(timestamp without time zone, unknown) does not exist

postgreSQL沒有date_format函數,用to_char函數替換

替換例子:

// %Y => YYYY 
// %m  =>   MM
// %d   =>  DD
// %H => HH24
// %i => MI
// %s => SS
to_char(time,'YYYY-MM-DD') => DATE_FORMAT(time,'%Y-%m-%d')
to_char(time,'YYYY-MM') => DATE_FORMAT(time,'%Y-%m')
to_char(time,'YYYYMMDDHH24MISS') => DATE_FORMAT(time,'%Y%m%d%H%i%s')

2.9、group by語法問題

異常信息

Cause: org.postgresql.util.PSQLException: ERROR: column  "r.name" must appear in the GROUP BY clause or be used in an  aggregate function

postgreSQL 的 selectd的字段必須是group by的字段里的 或者使用了聚合函數。mysql則沒有這個要求,非聚合列會隨機取值

錯誤例子

select name, age, count(*)
from user 
group by age, score

這時 select name 是錯誤的, 應為group by里沒有這個字段,要么加上,要么變成select min(name)

2.10、事務異常問題

異常信息

# Cause: org.postgresql.util.PSQLException: ERROR: current transaction is aborted, commands ignored until end of transaction block

; uncategorized SQLException; SQL state [25P02]; error code [0]; ERROR: current transaction is aborted, commands ignored until end of transaction block; nested exception is org.postgresql.util.PSQLException: ERROR: current transaction is aborted, commands ignored until end of transaction block

Postgres數據庫中,同一事務中如果某次數據庫操作中出錯的話,那這個事務以后的數據庫操作都會出錯。正常來說不會有這種情況,但是如果有人去捕獲了事務異常后又去執行數據庫操作就會導致這個問題。mysql貌似不會有這個問題

下面就是錯誤的代碼例子:靠異常去走邏輯。解決辦法就是不要靠數據庫的異常去控制邏輯,手動判斷。

圖片圖片

2.11、類型轉換異常 (大頭)

這個可以說是最坑的, 因為mysql是支持自動類型轉換的。在表字段類型和參數值之間如果類型不一樣也會自動進行轉換。而postgreSQL是強數據類型,字段類型和參數值類型之間必須一樣否則就會拋出異常。

這時候解決辦法一般有兩種

  • 手動修改代碼里的字段類型和傳參類型保證 或者 postgreSQL表字段類型,反正保證雙方一一對應
  • 添加自動隱式轉換函數,達到類似mysql的效果

布爾值和int類型類型轉換錯誤

1、select查詢時的轉換異常信息

Cause: org.postgresql.util.PSQLException: ERROR: operator does not exist: smallint = boolean
SELECT   xx fom xx    WHERE   enable = ture

錯誤原因:enable字段是smallint類型查詢卻傳了一個布爾值類型

2、update更新時的轉換異常信息

Cause: org.postgresql.util.PSQLException: ERROR: column "name" is of type smallint but expression is of type boolean
update from xx set name = false  where  name = true

錯誤原因:在update/insert賦值語句的時候,字段類型是smallint,但是傳參卻是布爾值類型

解決辦法:

postgres數據庫添加boolean <-> smallint 的自動轉換邏輯

-- 創建函數1  smallint到boolean到轉換函數
CREATE OR REPLACE FUNCTION "smallint_to_boolean"("i" int2)
  RETURNS "pg_catalog"."bool" AS $BODY$
 BEGIN
  RETURN (i::int2)::integer::bool;
 END;
$BODY$
LANGUAGE plpgsql VOLATILE
-- 創建賦值轉換1
create cast (SMALLINT as BOOLEAN) with function smallint_to_boolean as ASSIGNMENT;

-- 創建函數2    boolean到smallint到轉換函數
CREATE OR REPLACE FUNCTION "boolean_to_smallint"("b" bool)
  RETURNS "pg_catalog"."int2" AS $BODY$
 BEGIN
  RETURN (b::boolean)::bool::int;
 END;
$BODY$
LANGUAGE plpgsql VOLATILE

-- 創建隱式轉換2
create cast (BOOLEAN as SMALLINT) with function boolean_to_smallint as implicit;

如果想重來可以刪除掉上面創建的函數和轉換邏輯

-- 刪除函數
drop function smallint_to_boolean
-- 刪除轉換
drop  CAST (SMALLINT as BOOLEAN)

主要不要亂添加隱式轉換函數,可能導致  Could not choose a best candidate operator 異常 和 # operator is not unique 異常 就是在操作符比較的時候有多個轉換邏輯不知道用哪個了,死循環了

3、PostgreSQL輔助腳本

3.1、批量修改timestamptz腳本

批量修改表字段類型 timestamptz 為 timestamp, 因為我們說過前者無法與LocalDateTime對應上

ps:

  • timestamp without time zone 就是 timestamp
  • timestamp with time zone 就是 timestamptz
DO $$
DECLARE
    rec RECORD;
BEGIN
    FOR rec IN SELECT table_name, column_name,data_type
               FROM information_schema.columns
               where table_schema = '要處理的模式名'
               AND data_type = 'timestamp with time zone'
    LOOP
        EXECUTE 'ALTER TABLE ' || rec.table_name || ' ALTER COLUMN ' || rec.column_name || ' TYPE timestamp';
    END LOOP;
END $$;

3.2、批量設置時間默認值腳本

批量修改模式名下的所有字段類型為timestamp的并且字段名為 create_time 或者 update_time的字段的默認值為 CURRENT_TIMESTAMP

-- 注意 || 號拼接的后面的字符串前面要有一個空格
DO $$
DECLARE
    rec RECORD;
BEGIN
    FOR rec IN SELECT table_name, column_name,data_type
               FROM information_schema.columns
               where table_schema = '要處理的模式名'
                 AND data_type = 'timestamp without time zone'
                 -- 修改的字段名
          and column_name in ('create_time','update_time')
    LOOP
         EXECUTE 'ALTER TABLE ' || rec.table_name || ' ALTER COLUMN ' || rec.column_name || ' SET DEFAULT CURRENT_TIMESTAMP;';
    END LOOP;
END $$;

4、注意事項

  • 將數據表從mysql遷移postgres 要注意字段類型要對應不要變更(*)。
  • 原先是 tinyint的就變samllint類型,不要是bool類型,有時代碼字段類型可能對應不上。
  • 如果java字段是LocalDateTime原先mysql時間類型到postgres后不要用TIMESTAMPTZ類型。
  • mysql一般用tinyint類型和java的Boolean字段對應并且在查詢和更新時支持自動轉換,但是postgres是強類型不支持,如果想無縫遷移postgres內部就新增自動轉換的隱式函數,但是缺點是每次部署postgres后都要去執行一次腳本。

如果不想這樣,只能修改代碼的所有表對象的字段類型和傳參類型保證與postgres數據庫的字段類型對應,但是有些依賴的框架底層自己操作數據庫可能就無法修改源碼了,只能修改數據庫表字段類型了。

責任編輯:武曉燕 來源: 君哥聊技術
相關推薦

2025-09-10 07:53:52

2024-04-10 08:39:56

BigDecimal浮點數二進制

2022-11-18 07:34:12

Docker項目目錄

2022-02-28 08:55:31

數據庫MySQL索引

2022-06-28 10:50:21

ElectronHosts

2024-11-26 08:20:53

程序數據歸檔庫

2018-01-10 13:40:03

數據庫MySQL表設計

2020-09-06 10:02:32

項目管理戰略目標CIO

2023-03-06 07:50:19

內存回收Go

2021-07-28 05:01:29

Lombok前端測試

2024-11-20 18:16:39

MyBatis批量操作數據庫

2025-05-27 01:55:00

MySQL數據庫工具鏈

2021-10-15 06:49:37

MySQL

2023-06-21 10:05:32

MySQLPostgreSQL數據庫

2023-02-20 08:11:04

2022-09-17 23:46:47

vue前端

2021-09-25 13:05:10

MYSQL開發數據庫

2020-12-22 09:34:20

JavaScript開發技術

2021-04-14 17:34:18

線程安全

2020-09-15 08:46:26

Kubernetes探針服務端
點贊
收藏

51CTO技術棧公眾號

亚洲色图欧美在线| 欧美一区精品| 欧美性受xxxx黑人xyx| 欧美日韩精品不卡| 波多野结衣电车痴汉| 精品一区二区三| 欧美三级中文字幕| 精品一区二区三区毛片| 国产熟女一区二区丰满| 午夜视频一区| 亚洲毛片在线免费观看| 99sesese| 国产啊啊啊视频在线观看| 国产一区二区精品久久91| 欧美多人爱爱视频网站| 国产福利在线观看视频| 日本另类视频| 一区二区三区在线视频观看58| 99re在线播放| 亚洲婷婷综合网| 久久久人成影片免费观看| 精品乱人伦小说| 色婷婷综合久久久久中文字幕 | 日韩一区二区三区不卡| 老司机精品导航| 久久亚洲私人国产精品va| 在线天堂www在线国语对白| 国产一区二区精品调教| 亚洲免费在线视频| 久久精品人人做人人爽电影| 中文字幕久久久久| 国内精品久久久久久久97牛牛 | 91麻豆精品国产无毒不卡在线观看| 国产传媒久久久| 国产福利免费在线观看| 国产成人a级片| 国产精品aaa| 国产一级二级三级视频| 日韩欧美不卡| 亚洲国产一区二区三区在线观看| 50路60路老熟妇啪啪| 亚洲综合伊人久久大杳蕉| 久久综合999| 99视频网站| 天天干天天插天天射| 亚洲美女网站| 精品中文字幕乱| 女教师淫辱の教室蜜臀av软件| 国产香蕉精品| 欧美一级黄色大片| www日韩在线观看| 黄色激情在线播放| 亚洲一区在线观看视频| www.黄色网址.com| 久久日韩视频| 中文字幕在线不卡国产视频| 欧美在线一区二区三区四区| 色丁香婷婷综合久久| 国产精品综合二区| 91久久在线播放| 一区二区三区在线免费观看视频| 久久久人人人| 51视频国产精品一区二区| 久久精品免费av| 欧美亚洲不卡| 久热精品视频在线观看| 色婷婷在线视频观看| 四虎成人精品永久免费av九九| 亚洲欧洲视频在线| 亚洲精品成人无码熟妇在线| 九九热播视频在线精品6| 精品少妇一区二区三区日产乱码| 午夜在线观看av| 素人一区二区三区| 欧美在线三级电影| 亚洲成人av免费看| 久久亚洲精品爱爱| 欧洲色大大久久| 亚洲精品一二三四五区| 韩国美女久久| 在线精品国精品国产尤物884a| 日韩免费毛片视频| 日本成人福利| 欧美精品18+| 爽爽爽在线观看| 国产精品igao视频网网址不卡日韩| 欧美日韩高清在线| 毛片毛片毛片毛| 精品视频一区二区三区| 欧美日韩在线三级| 国产情侣av自拍| 国产v综合v| 欧美视频一区在线观看| 美女网站视频黄色| www.成人在线.com| 亚洲变态欧美另类捆绑| 美国黄色a级片| 国产伦一区二区三区| 丝袜亚洲另类欧美重口| 欧美 日韩 国产 一区二区三区| 亚洲午夜伦理| 久久久久久欧美| 亚洲欧美综合自拍| 美女视频黄 久久| 91日韩久久| 日韩一区免费视频| 久久精品在这里| 穿情趣内衣被c到高潮视频| xxx.xxx欧美| 在线视频你懂得一区| 午夜免费福利网站| 亚州av一区| 日韩在线欧美在线| 黑人巨大精品一区二区在线| 国产麻豆综合| 91免费电影网站| 亚洲欧美另类综合| 久久久91精品国产一区二区精品 | 激情在线视频| 亚洲中国最大av网站| 亚洲一二三区av| 全球av集中精品导航福利| 久久成人亚洲精品| 久久久久精彩视频| 久久这里只有精品视频网| japanese在线播放| 一区二区三区日本视频| 亚洲新中文字幕| 最新中文字幕一区| av午夜一区麻豆| 黄色小视频大全| 亚洲伦理久久| 色婷婷综合久久久久| jizz国产在线观看| www日韩大片| 久久久999免费视频| 成人自拍在线| 欧美精品在线极品| 国产伦一区二区| 国产精品国产三级国产三级人妇 | 波多野结衣在线网址| 日韩电影在线观看一区| 日本欧洲国产一区二区| 国产乱码午夜在线视频| 亚洲激情免费观看| 久久露脸国语精品国产91| 国产精品1区2区3区在线观看| 亚洲乱码一区二区三区三上悠亚| 欧美男男video| 欧美成人a在线| tube国产麻豆| 久久99热这里只有精品| 日本黑人久久| 亚洲天堂免费电影| 亚洲第一精品福利| 九九视频免费在线观看| 精品一区二区久久| 日韩欧美亚洲v片| 免费在线成人激情电影| 亚洲天堂成人在线| 欧美一级淫片免费视频黄| 26uuu色噜噜精品一区二区| 成年人午夜免费视频| 欧美人体视频| 欧洲美女免费图片一区| 三区在线视频| 色综合色综合色综合 | 国产精品对白| 久久久久久久久久久亚洲| 亚洲精品无遮挡| 亚洲夂夂婷婷色拍ww47| 中国xxxx性xxxx产国| 最新日韩在线| 日本一区视频在线| jizz久久久久久| 日韩在线国产精品| 国产精品自产拍| 亚洲精品日韩一| 免费日本黄色网址| 亚洲尤物在线| 日韩不卡av| 日韩成人免费av| 久久综合伊人77777蜜臀| 色一情一乱一区二区三区| 午夜精品影院在线观看| 女~淫辱の触手3d动漫| 免费看日韩精品| 色呦呦网站入口| 精品网站aaa| 国产精品久久久久高潮| 男人在线资源站| 欧美www视频| caoporn国产| 亚洲欧美日韩成人高清在线一区| 亚洲AV成人精品| 亚洲在线免费| 亚洲免费精品视频| 999国产精品一区| 国产精品久久久av| 曰本三级在线| 亚洲欧美日韩视频一区| 一区二区三区亚洲视频| 樱花影视一区二区| 成人午夜剧场视频网站| 狠狠网亚洲精品| 男人添女人下部高潮视频在观看| 欧美美女视频| 国产欧美一区二区三区另类精品| 三上悠亚国产精品一区二区三区| 精品国产一区二区三区久久狼黑人 | 五月精品视频| 欧美日韩亚洲免费| 北条麻妃一区二区三区在线| 国产有码一区二区| 色多多在线观看| 九九热这里只有精品6| 阿v免费在线观看| 亚洲免费精彩视频| 蜜桃久久一区二区三区| 欧美高清视频一二三区| 日本一区二区三区精品| 亚洲一区影音先锋| 综合 欧美 亚洲日本| 国产伦理精品不卡| 日本肉体xxxx裸体xxx免费| 亚洲国内欧美| wwwjizzjizzcom| 日韩久久视频| 日韩高清国产一区在线观看| 精品欠久久久中文字幕加勒比| 国产日韩中文字幕| 国产精品专区免费| 国产91精品久久久久久| 午夜在线激情影院| 日日噜噜噜夜夜爽亚洲精品| 青草久久伊人| 亚洲国产日韩一区| 韩国av免费在线观看| 欧美男女性生活在线直播观看| 久久一区二区三区视频| 亚洲国产日韩综合久久精品| 久久国产精品二区| 亚洲色图欧洲色图婷婷| 秋霞欧美一区二区三区视频免费| 久久久噜噜噜久久中文字幕色伊伊 | www.av免费| 国产精品久久久久久久久图文区| 亚洲第九十七页| 粉嫩aⅴ一区二区三区四区| 野花视频免费在线观看| 国产米奇在线777精品观看| 欧美午夜aaaaaa免费视频| 久久久久国产精品一区三寸| 国产精品视频一二三四区| 亚洲一本二本| 香蕉视频在线网址| 久久国产小视频| 久久天堂国产精品| 国产欧美一区| 神马一区二区影院| 欧美成人精品一区二区三区在线看| 免费久久99精品国产自| 精品久久影视| 亚洲成人自拍| 久久国产电影| 欧美a级黄色大片| 亚洲婷婷在线| 浮妇高潮喷白浆视频| 一区二区福利| 国产av人人夜夜澡人人爽麻豆| 国产精品最新自拍| 北条麻妃视频在线| 久久激情五月激情| 午夜剧场在线免费观看| 国产91丝袜在线18| 亚洲av无码一区东京热久久| 成人av网站免费| 日韩av无码一区二区三区不卡| 久久这里只有精品6| 男人的天堂av网| 亚洲天堂久久久久久久| 久久久久久久久久久久久女过产乱| 亚洲h在线观看| 波多野结衣视频网站| 日本二三区不卡| 少妇无套内谢久久久久| 日韩手机在线导航| 五月婷婷六月激情| 国产一区二区三区中文| 噜噜噜在线观看播放视频| 久久久精品美女| 久久国产精品黑丝| 国产999精品久久久| 亚洲综合资源| 狠狠色噜噜狠狠色综合久| 国产一区三区在线播放| 懂色av一区二区三区四区五区| 宅男噜噜噜66国产日韩在线观看| 91蝌蚪视频在线观看| 久久se精品一区二区| 日韩av成人网| 国产精品久久精品日日| 久久精品国产亚洲av无码娇色| 欧美日韩在线影院| 一区二区精品视频在线观看| 亚洲精品国精品久久99热| 爱久久·www| 午夜伦理精品一区| 日韩av一级| 国产日韩欧美综合精品| 色综合久久网| 亚洲自偷自拍熟女另类| 国产成人自拍网| 精品国产成人亚洲午夜福利| 一区二区三区四区蜜桃| 波多野结衣人妻| 亚洲激情成人网| a视频在线观看| 国产精品老女人精品视频| 日韩中文一区二区| 日韩欧美三级一区二区| 夜夜嗨一区二区| 深爱五月综合网| 国产精品三级在线观看| 亚洲永久精品在线观看| 欧美一区二区三区小说| 亚洲aaa在线观看| 97久久伊人激情网| 成人在线视频区| 日韩久久久久久久| 国产精品一二| www.啪啪.com| 亚洲精品乱码久久久久久黑人 | 欧美fxxxxxx另类| 日韩欧美黄色大片| 9l国产精品久久久久麻豆| 国产传媒免费在线观看| 欧美视频在线不卡| 国产三级在线| 奇米4444一区二区三区 | 日本少妇一级片| 亚洲男同性恋视频| 中文字幕第315页| 亚洲网址你懂得| 福利一区二区免费视频| 久久免费99精品久久久久久| 激情国产一区| 亚洲少妇中文字幕| 夜夜嗨av一区二区三区网页| 国产又粗又猛又爽又黄的视频一 | 国产国语性生话播放| 亚洲成a人片综合在线| 精品人妻aV中文字幕乱码色欲 | 成人性视频免费看| 欧美亚洲禁片免费| 九色蝌蚪在线| 国产精品午夜一区二区欲梦| 欧洲激情综合| 国产 porn| 亚洲天天做日日做天天谢日日欢| 伊人久久一区二区| 永久免费毛片在线播放不卡| 全亚洲第一av番号网站| 日韩欧美亚洲v片| 麻豆一区二区三区| 国产白丝一区二区三区| 欧美精品aⅴ在线视频| 国产日产一区二区| 亚洲最大的av网站| 亚洲精品乱码| www.色天使| 欧美三级日韩三级国产三级| 成年午夜在线| 亚洲最大成人在线| 亚洲欧洲视频| 无码熟妇人妻av| 欧美日本在线看| 99在线播放| 久久99精品久久久久久水蜜桃| 日产国产高清一区二区三区| 久久精品色妇熟妇丰满人妻| 欧美一区二区免费视频| 丁香花在线观看完整版电影| 久久久久久久久久码影片| 天堂久久久久va久久久久| 亚洲伦理一区二区三区| 亚洲第一男人天堂| 超碰超碰人人人人精品| 在线国产伦理一区| 福利一区二区在线| 91午夜精品亚洲一区二区三区| 亚洲最新视频在线| 日韩精品一区国产| 国产伦精品一区二区三区四区视频_| 国产精品白丝jk白祙喷水网站| 久久久午夜影院| 日韩中文娱乐网| 国产成人夜色高潮福利影视| 午夜剧场高清版免费观看| 亚洲一区二区三区国产|