精品欧美一区二区三区在线观看 _久久久久国色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技術棧公眾號

亚洲一区二区三区免费在线观看| 风间由美一区二区av101 | 欧美日韩午夜在线视频| 亚洲精品一区二区毛豆| 国产激情视频在线播放| 99热在线精品观看| 日韩最新中文字幕电影免费看| 国产成人精品综合久久久久99 | 午夜精品理论片| 舐め犯し波多野结衣在线观看| 色综合久久久| 性久久久久久久久久久久| 欧美一进一出视频| 99re只有精品| 欧美一级久久| 欧美精品一本久久男人的天堂| 一本色道综合久久欧美日韩精品| 日韩三区四区| 欧美性极品少妇精品网站| 7777在线视频| 国产高清视频在线观看| 成人在线综合网| 国产精品欧美日韩一区二区| 中文字幕亚洲欧美日韩| 国产日韩欧美一区二区三区| 日韩欧美国产wwwww| 天堂在线资源视频| cao在线视频| 亚洲人吸女人奶水| 亚洲精品第一区二区三区| 国产综合在线播放| 国内外成人在线| 国产精品老牛影院在线观看| 国产精品suv一区二区三区| 亚洲欧美一区在线| 日韩有码在线观看| 五月婷六月丁香| 欧美欧美黄在线二区| 精品国产乱码久久久久久1区2区| 99九九99九九九99九他书对| 成人看片网页| 欧美性猛xxx| www.浪潮av.com| 波多野结衣在线播放| 亚洲免费观看高清完整版在线观看| 欧洲精品在线一区| 免费在线一级视频| 久久色视频免费观看| 激情一区二区三区| 天天干,天天操,天天射| 岛国精品在线观看| 114国产精品久久免费观看| 一级黄色大片免费观看| 美女www一区二区| 国产精品久久久久久网站 | 欧美精品在线视频| 高潮一区二区三区| 四虎影视国产精品| 51精品国自产在线| 久久久福利影院| 日韩激情综合| 精品免费视频.| 大尺度做爰床戏呻吟舒畅| 国产精品45p| 亚洲第一综合天堂另类专| 午夜免费福利影院| 午夜精品福利影院| 在线播放亚洲激情| 久久久精品少妇| 欧美在线网站| 午夜精品久久久久久久白皮肤| 久久一区二区三区视频| 久久久夜精品| 国产精品稀缺呦系列在线 | 欧美精品一区二区高清在线观看| 欧美一级片在线免费观看| 成人福利免费在线观看| 亚洲欧美国产精品| 日本视频在线免费| 欧美1区3d| 97在线视频一区| 中文字幕第一页在线播放| 久久国产综合精品| 高清不卡一区二区三区| 美国一级片在线免费观看视频| 欧美国产综合色视频| 秋霞在线一区二区| 国产传媒在线| 欧美日韩国产综合草草| 成年人看片网站| 国产精品欧美日韩一区| 久久精品福利视频| 圆产精品久久久久久久久久久| 日韩一区精品视频| 成人欧美一区二区三区视频| 亚洲欧美日韩免费| 专区另类欧美日韩| av动漫在线观看| 97色婷婷成人综合在线观看| 精品日韩99亚洲| 国产精久久一区二区三区| 亚洲va在线| 秋霞av国产精品一区| 亚洲自拍偷拍另类| 91在线小视频| 91九色国产ts另类人妖| 中文字幕在线视频网站| 6080午夜不卡| 一本色道久久综合亚洲精品图片| 99精品视频在线观看免费播放| 91精品91久久久久久| 91中文字幕在线视频| 91在线国产观看| 四虎影院一区二区| 小黄鸭精品aⅴ导航网站入口| 欧美一区二区日韩| 91激情视频在线观看| 韩日精品视频| 成人乱色短篇合集| 国内av一区二区三区| 亚洲国产综合色| 天堂av2020| 日韩成人影院| 日韩美女福利视频| 日日夜夜精品免费| 亚洲九九爱视频| 亚洲成人天堂网| 久久爱www成人| 国模精品系列视频| www.久久久久久| 一区在线观看免费| 亚洲少妇久久久| 亚洲涩涩av| 77777亚洲午夜久久多人| 国产xxxxxx| 中文字幕综合网| 岛国毛片在线播放| 国产欧美日韩精品一区二区免费| 97色在线播放视频| 亚洲乱熟女一区二区| 亚洲另类春色国产| 最好看的中文字幕| 欧美1区2区| 成人av蜜桃| 中文字幕在线三区| 日韩欧美色电影| 欧美日韩免费做爰视频| 国产一区二区在线影院| 综合操久久久| 91成人小视频| 欧美精品在线网站| 精品久久久中文字幕人妻| 亚洲视频一二三区| 91性高潮久久久久久久| 欧美一区亚洲| 国产精品xxxx| а√天堂资源官网在线资源| 亚洲国产精彩中文乱码av在线播放 | 天天干天天插天天射| 久久久噜噜噜久噜久久综合| 国产精品亚洲a| 精品国产一区二区三区久久久樱花 | 国产成人免费在线观看视频| 免费在线观看成人| 国产精品美女在线播放| 国产精品毛片无码| 欧美日韩成人在线播放| 成人乱码一区二区三区| 亚欧色一区w666天堂| 一区二区三区少妇| 日产欧产美韩系列久久99| 亚洲.欧美.日本.国产综合在线| 男人天堂久久| 美女性感视频久久久| 亚洲欧美激情另类| 欧美性极品xxxx做受| 美国美女黄色片| 国产美女精品一区二区三区| 成人精品视频在线播放| 一本色道久久综合狠狠躁的番外| 国产精品福利片| 成人看片免费| 日韩av综合网站| 最近中文字幕av| 一区二区三区四区精品在线视频| 影音先锋人妻啪啪av资源网站| 久久久久久穴| 在线观看免费黄色片| 精品中国亚洲| 国产精品丝袜白浆摸在线 | 色综合久久中文| 国产精品入口免费视频一| 国产成人无吗| 日韩激情av在线播放| 一级日韩一级欧美| 亚洲444eee在线观看| 操她视频在线观看| 97久久超碰国产精品| 99sesese| 国产情侣一区| 韩国黄色一级大片| 免费欧美一区| 国产高清一区二区三区| 日本h片久久| 孩xxxx性bbbb欧美| 成年人黄视频在线观看| 亚洲人成网在线播放| 亚洲av无码一区二区三区性色| 色www精品视频在线观看| 久久婷婷综合国产| 国产精品私房写真福利视频| 欧类av怡春院| 精品一区二区国语对白| 免费毛片小视频| 欧美精品国产| 一区视频二区视频| 少妇精品久久久一区二区| julia一区二区中文久久94| 草民电影神马电影一区二区| 98精品国产自产在线观看| 亚洲大胆人体大胆做受1| 色先锋资源久久综合5566| 日韩美女一级视频| 精品成人a区在线观看| 国产特级黄色片| 欧美日韩免费高清一区色橹橹| 五月婷婷亚洲综合| 亚洲国产成人精品视频| 中文字幕电影av| 一区免费观看视频| 久久久久麻豆v国产| 国产日韩综合av| 国产精品无码午夜福利| 99久久免费精品高清特色大片| jjzz黄色片| 国产精品18久久久久| 777一区二区| 免费在线成人网| 五月婷婷丁香综合网| 日韩精品视频网| 香蕉视频网站入口| 秋霞成人午夜伦在线观看| 成年人网站大全| 视频一区二区三区在线| 成人在线免费播放视频| 视频一区二区欧美| 日本888xxxx| 欧美aa在线视频| 亚洲欧美激情网| 奇米亚洲午夜久久精品| 久久久国产欧美| 免费在线观看精品| 久久久久xxxx| 国产福利91精品一区二区三区| 黄页网站在线看| 成人激情校园春色| xxxx黄色片| 久久一区二区三区四区| 丁香激情五月少妇| 国产精品国产a| 亚洲不卡在线播放| 亚洲精品国产品国语在线app| 国产成人无码aa精品一区| 一区二区三区四区亚洲| 日韩av一二三区| 狠狠躁夜夜躁人人爽天天天天97| 中文字幕视频网| 欧美性淫爽ww久久久久无| 一区二区日韩视频| 日韩欧美一区在线观看| 天天射,天天干| 亚洲天堂网在线观看| 欧美激情办公室videoshd| 九九久久久久久久久激情| 超碰资源在线| 国产精品久久久久7777婷婷| 亚洲热av色在线播放| 91免费看网站| 欧美jizz19性欧美| 色噜噜狠狠色综合网| 亚洲高清影视| koreanbj精品视频一区| 青青草精品视频| 人人爽人人爽av| 99视频国产精品| 五月婷婷欧美激情| 一区二区三区中文免费| 国内自拍视频在线播放| 欧美另类变人与禽xxxxx| 亚洲第一色视频| 亚洲天堂男人天堂| 18加网站在线| 国产成人精品免高潮在线观看 | 在线播放国产精品二区一二区四区| 精品久久久免费视频| 亚洲人成在线观| 色www永久免费视频首页在线| 日韩av色在线| 91综合久久爱com| 亚洲一区二区三区免费看| 亚洲视频综合| 在线观看国产一级片| av电影天堂一区二区在线观看| 一本在线免费视频| 精品国产91久久久久久| 国产美女www爽爽爽视频| 亚洲精品丝袜日韩| 色老头在线观看| 国产精品久久久久一区二区| 黑人久久a级毛片免费观看| 亚洲国产欧美日韩| 99热精品在线观看| 中文字幕1区2区| 国产精品久久福利| 在线观看 亚洲| 亚洲第一精品夜夜躁人人爽| 日本在线免费| 欧美在线亚洲在线| 国产精品一区二区中文字幕| 在线免费一区| 日产欧产美韩系列久久99| 亚洲国产第一区| 亚洲综合视频在线| 99久久夜色精品国产亚洲| 永久免费精品影视网站| 韩国久久久久久| 国产一区二区久久久| 欧美阿v一级看视频| 亚洲天堂伊人网| 中文字幕亚洲视频| 成人黄色三级视频| 亚洲欧美日韩天堂| 中文字幕资源网在线观看免费| 国产日韩精品一区观看| 自拍偷拍欧美专区| 国产5g成人5g天天爽| 国产精品久久久久久久久免费丝袜 | 在线播放国产视频| 国产精品国产成人国产三级| 波多野结衣一区二区在线 | 美女被到爽高潮视频| 欧美日韩国产中文字幕| 天天操天天插天天射| 国外色69视频在线观看| 六月丁香久久丫| 欧美爱爱视频免费看| 99精品国产99久久久久久白柏| 圆产精品久久久久久久久久久| 亚洲国产天堂久久国产91| 男女免费观看在线爽爽爽视频| 91嫩草免费看| 国产一区二区三区自拍| 香蕉视频免费网站| 午夜日韩在线电影| 少妇精品高潮欲妇又嫩中文字幕| 久久久久久久亚洲精品| 欧美绝顶高潮抽搐喷水合集| 69堂免费视频| 久久久久综合网| 小泽玛利亚一区二区三区视频| 中文字幕亚洲欧美| 国产乱码精品一区二区三区亚洲人 | 精品国产aⅴ一区二区三区东京热 久久久久99人妻一区二区三区 | 韩日欧美一区| 日韩精品一区二区三区高清免费| 午夜精品一区二区三区电影天堂 | 国产精品xnxxcom| 黑人巨茎大战欧美白妇| 国产91综合一区在线观看| 亚洲国产精品午夜在线观看| 亚洲精品国产拍免费91在线| 成人影院入口| 亚洲欧美日韩综合一区| 国产精选一区二区三区| a v视频在线观看| 亚洲人成网站777色婷婷| 亚洲伊人精品酒店| 久艹在线免费观看| 久久综合久久99| 亚洲中文字幕在线观看| 欧美韩国理论所午夜片917电影| 国产成人精品福利| 91在线视频观看免费| 亚洲欧美视频在线观看| 香港一级纯黄大片| 国产精品日韩欧美综合| 欧美精品一卡| 精品国产无码在线观看| 91.麻豆视频| 女人让男人操自己视频在线观看| 翔田千里亚洲一二三区| 国产精品白丝av| 91精品国产高清一区二区三密臀| 俺去了亚洲欧美日韩| 天天操综合520| 男女污污视频网站| 欧美日韩亚洲网| 最新国产在线拍揄自揄视频| 欧美色欧美亚洲另类七区| 国产成人av一区二区三区在线|