【數據庫】PostgreSQL詳解:企業級關系型數據庫

文章目錄

    • 什么是PostgreSQL?
    • 核心特性
      • 1. 標準兼容性
      • 2. 擴展性
      • 3. 高級功能
      • 4. 可靠性
    • 數據類型
      • 1. 基本數據類型
      • 2. 高級數據類型
    • 基本操作
      • 1. 數據庫操作
      • 2. 表操作
      • 3. 數據操作
    • 高級查詢
      • 1. 連接查詢
      • 2. 子查詢
      • 3. 窗口函數
    • JSON操作
      • 1. JSON數據類型
      • 2. JSON查詢
      • 3. JSON索引
    • 全文搜索
      • 1. 創建全文索引
      • 2. 全文搜索查詢
    • 存儲過程
      • 1. 創建存儲過程
      • 2. 帶參數的存儲過程
    • 觸發器
      • 1. 創建觸發器
      • 2. 審計觸發器
    • 視圖
      • 1. 創建視圖
      • 2. 物化視圖
    • 分區表
      • 1. 范圍分區
      • 2. 列表分區
    • 并發控制
      • 1. 事務
      • 2. 鎖
    • 性能優化
      • 1. 索引優化
      • 2. 查詢優化
      • 3. 配置優化
    • 備份與恢復
      • 1. 邏輯備份
      • 2. 恢復
      • 3. 物理備份
    • 復制
      • 1. 主從復制
      • 2. 邏輯復制
    • 與Python集成
      • 使用psycopg2
      • 使用SQLAlchemy
    • 常見應用場景
    • 優缺點分析
      • 優點
      • 缺點
    • 學習資源推薦
    • 總結


什么是PostgreSQL?

PostgreSQL是一個功能強大的開源對象關系型數據庫系統,擁有超過35年的活躍開發歷史。它以其可靠性、功能完整性和性能著稱,被業界譽為"最先進的開源數據庫"。

核心特性

1. 標準兼容性

  • 完全符合SQL標準
  • 支持ACID事務
  • 支持復雜查詢和子查詢

2. 擴展性

  • 支持自定義數據類型
  • 支持自定義函數和操作符
  • 支持存儲過程和觸發器

3. 高級功能

  • JSON和JSONB支持
  • 全文搜索
  • 地理空間數據支持(PostGIS)
  • 分區表
  • 并行查詢

4. 可靠性

  • 多版本并發控制(MVCC)
  • 時間點恢復(PITR)
  • 在線備份
  • 流復制

數據類型

1. 基本數據類型

-- 數值類型
SMALLINT      -- 2字節整數
INTEGER       -- 4字節整數
BIGINT        -- 8字節整數
DECIMAL       -- 精確數值
REAL          -- 4字節浮點數
DOUBLE PRECISION -- 8字節浮點數-- 字符類型
CHAR(n)       -- 定長字符串
VARCHAR(n)    -- 變長字符串
TEXT          -- 不限長度文本-- 日期時間類型
DATE          -- 日期
TIME          -- 時間
TIMESTAMP     -- 日期和時間
INTERVAL      -- 時間間隔

2. 高級數據類型

-- JSON類型
JSON          -- JSON文本
JSONB         -- 二進制JSON,支持索引-- 數組類型
INTEGER[]     -- 整數數組
TEXT[]        -- 文本數組-- 幾何類型
POINT         -- 點
LINE          -- 線
POLYGON       -- 多邊形-- 網絡地址類型
INET          -- IPv4/IPv6地址
CIDR          -- 網絡地址
MACADDR       -- MAC地址

基本操作

1. 數據庫操作

-- 創建數據庫
CREATE DATABASE mydb WITH OWNER postgres;-- 刪除數據庫
DROP DATABASE mydb;-- 連接數據庫
\c mydb

2. 表操作

-- 創建表
CREATE TABLE users (id SERIAL PRIMARY KEY,username VARCHAR(50) UNIQUE NOT NULL,email VARCHAR(100) UNIQUE NOT NULL,age INTEGER CHECK (age >= 0),created_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP,updated_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP
);-- 修改表
ALTER TABLE users ADD COLUMN phone VARCHAR(20);
ALTER TABLE users ALTER COLUMN email TYPE VARCHAR(150);-- 創建索引
CREATE INDEX idx_users_username ON users(username);
CREATE UNIQUE INDEX idx_users_email ON users(email);-- 刪除表
DROP TABLE users;

3. 數據操作

-- 插入數據
INSERT INTO users (username, email, age) 
VALUES ('john_doe', 'john@example.com', 30);-- 批量插入
INSERT INTO users (username, email, age) 
VALUES ('alice', 'alice@example.com', 25),('bob', 'bob@example.com', 35);-- 查詢數據
SELECT * FROM users WHERE age > 25;
SELECT username, email FROM users ORDER BY created_at DESC LIMIT 10;-- 更新數據
UPDATE users SET age = 31 WHERE username = 'john_doe';-- 刪除數據
DELETE FROM users WHERE age < 18;

高級查詢

1. 連接查詢

-- 內連接
SELECT u.username, p.title, p.content
FROM users u
INNER JOIN posts p ON u.id = p.user_id;-- 左連接
SELECT u.username, COUNT(p.id) as post_count
FROM users u
LEFT JOIN posts p ON u.id = p.user_id
GROUP BY u.username;-- 全連接
SELECT * FROM table1
FULL OUTER JOIN table2 ON table1.id = table2.id;

2. 子查詢

-- 標量子查詢
SELECT username, (SELECT COUNT(*) FROM posts WHERE user_id = users.id) as post_count
FROM users;-- 行子查詢
SELECT * FROM users
WHERE (age, username) IN (SELECT age, username FROM users_backup);-- 存在子查詢
SELECT * FROM users
WHERE EXISTS (SELECT 1 FROM posts WHERE user_id = users.id);

3. 窗口函數

-- 排名函數
SELECT username, age,RANK() OVER (ORDER BY age DESC) as age_rank,DENSE_RANK() OVER (ORDER BY age DESC) as dense_rank
FROM users;-- 聚合窗口函數
SELECT username, age,AVG(age) OVER () as avg_age,SUM(age) OVER (ORDER BY id) as cumulative_age
FROM users;-- 分區窗口函數
SELECT username, age, department,ROW_NUMBER() OVER (PARTITION BY department ORDER BY age) as dept_rank
FROM users;

JSON操作

1. JSON數據類型

-- 創建包含JSON的表
CREATE TABLE products (id SERIAL PRIMARY KEY,name VARCHAR(100),attributes JSONB
);-- 插入JSON數據
INSERT INTO products (name, attributes) 
VALUES ('Laptop', '{"brand": "Dell", "specs": {"cpu": "i7", "ram": "16GB"}}');

2. JSON查詢

-- 查詢JSON字段
SELECT * FROM products 
WHERE attributes->>'brand' = 'Dell';-- 查詢嵌套JSON
SELECT * FROM products 
WHERE attributes->'specs'->>'cpu' = 'i7';-- 使用JSON操作符
SELECT name, attributes->'specs'->>'ram' as ram
FROM products
WHERE attributes @> '{"brand": "Dell"}';-- JSON數組查詢
SELECT * FROM products
WHERE attributes->'tags' ? 'gaming';

3. JSON索引

-- 創建GIN索引
CREATE INDEX idx_products_attributes ON products USING GIN (attributes);-- 創建特定路徑的索引
CREATE INDEX idx_products_brand ON products ((attributes->>'brand'));

全文搜索

1. 創建全文索引

-- 創建表
CREATE TABLE articles (id SERIAL PRIMARY KEY,title VARCHAR(200),content TEXT,search_vector tsvector
);-- 創建全文索引
CREATE INDEX idx_articles_search ON articles USING GIN (search_vector);-- 更新搜索向量
UPDATE articles 
SET search_vector = to_tsvector('english', title || ' ' || content);

2. 全文搜索查詢

-- 基本全文搜索
SELECT * FROM articles
WHERE search_vector @@ to_tsquery('english', 'database & postgresql');-- 排名搜索結果
SELECT title, ts_rank(search_vector, to_tsquery('english', 'postgresql')) as rank
FROM articles
WHERE search_vector @@ to_tsquery('english', 'postgresql')
ORDER BY rank DESC;-- 高亮搜索結果
SELECT title, ts_headline('english', content, to_tsquery('postgresql')) as highlighted
FROM articles
WHERE search_vector @@ to_tsquery('postgresql');

存儲過程

1. 創建存儲過程

-- 創建函數
CREATE OR REPLACE FUNCTION get_user_posts(user_id INTEGER)
RETURNS TABLE(post_title VARCHAR, post_date TIMESTAMP) AS $$
BEGINRETURN QUERYSELECT p.title, p.created_atFROM posts pWHERE p.user_id = get_user_posts.user_idORDER BY p.created_at DESC;
END;
$$ LANGUAGE plpgsql;-- 調用函數
SELECT * FROM get_user_posts(1);

2. 帶參數的存儲過程

-- 創建帶參數的函數
CREATE OR REPLACE FUNCTION create_user(p_username VARCHAR,p_email VARCHAR,p_age INTEGER
) RETURNS INTEGER AS $$
DECLAREnew_id INTEGER;
BEGININSERT INTO users (username, email, age)VALUES (p_username, p_email, p_age)RETURNING id INTO new_id;RETURN new_id;
END;
$$ LANGUAGE plpgsql;-- 調用函數
SELECT create_user('newuser', 'new@example.com', 25);

觸發器

1. 創建觸發器

-- 創建觸發器函數
CREATE OR REPLACE FUNCTION update_updated_at()
RETURNS TRIGGER AS $$
BEGINNEW.updated_at = CURRENT_TIMESTAMP;RETURN NEW;
END;
$$ LANGUAGE plpgsql;-- 創建觸發器
CREATE TRIGGER update_users_updated_atBEFORE UPDATE ON usersFOR EACH ROWEXECUTE FUNCTION update_updated_at();

2. 審計觸發器

-- 創建審計表
CREATE TABLE user_audit (id SERIAL PRIMARY KEY,user_id INTEGER,action VARCHAR(10),old_data JSONB,new_data JSONB,changed_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP
);-- 創建審計觸發器
CREATE OR REPLACE FUNCTION audit_user_changes()
RETURNS TRIGGER AS $$
BEGINIF TG_OP = 'DELETE' THENINSERT INTO user_audit (user_id, action, old_data)VALUES (OLD.id, 'DELETE', row_to_json(OLD)::jsonb);RETURN OLD;ELSIF TG_OP = 'UPDATE' THENINSERT INTO user_audit (user_id, action, old_data, new_data)VALUES (OLD.id, 'UPDATE', row_to_json(OLD)::jsonb, row_to_json(NEW)::jsonb);RETURN NEW;ELSIF TG_OP = 'INSERT' THENINSERT INTO user_audit (user_id, action, new_data)VALUES (NEW.id, 'INSERT', row_to_json(NEW)::jsonb);RETURN NEW;END IF;RETURN NULL;
END;
$$ LANGUAGE plpgsql;-- 創建觸發器
CREATE TRIGGER user_audit_triggerAFTER INSERT OR UPDATE OR DELETE ON usersFOR EACH ROWEXECUTE FUNCTION audit_user_changes();

視圖

1. 創建視圖

-- 創建簡單視圖
CREATE VIEW active_users AS
SELECT id, username, email, age
FROM users
WHERE status = 'active';-- 創建復雜視圖
CREATE VIEW user_statistics AS
SELECT u.id,u.username,u.email,COUNT(p.id) as post_count,MAX(p.created_at) as last_post_date
FROM users u
LEFT JOIN posts p ON u.id = p.user_id
GROUP BY u.id, u.username, u.email;

2. 物化視圖

-- 創建物化視圖
CREATE MATERIALIZED VIEW monthly_stats AS
SELECT DATE_TRUNC('month', created_at) as month,COUNT(*) as user_count,AVG(age) as avg_age
FROM users
GROUP BY DATE_TRUNC('month', created_at);-- 刷新物化視圖
REFRESH MATERIALIZED VIEW monthly_stats;-- 創建索引
CREATE INDEX idx_monthly_stats_month ON monthly_stats (month);

分區表

1. 范圍分區

-- 創建分區表
CREATE TABLE sales (id SERIAL,sale_date DATE,amount DECIMAL(10,2),customer_id INTEGER
) PARTITION BY RANGE (sale_date);-- 創建分區
CREATE TABLE sales_2024_q1 PARTITION OF salesFOR VALUES FROM ('2024-01-01') TO ('2024-04-01');CREATE TABLE sales_2024_q2 PARTITION OF salesFOR VALUES FROM ('2024-04-01') TO ('2024-07-01');

2. 列表分區

-- 創建列表分區表
CREATE TABLE customers (id SERIAL,name VARCHAR(100),region VARCHAR(50)
) PARTITION BY LIST (region);-- 創建分區
CREATE TABLE customers_north PARTITION OF customersFOR VALUES IN ('North', 'Northeast', 'Northwest');CREATE TABLE customers_south PARTITION OF customersFOR VALUES IN ('South', 'Southeast', 'Southwest');

并發控制

1. 事務

-- 開始事務
BEGIN;-- 執行操作
UPDATE accounts SET balance = balance - 100 WHERE id = 1;
UPDATE accounts SET balance = balance + 100 WHERE id = 2;-- 提交事務
COMMIT;-- 回滾事務
ROLLBACK;

2. 鎖

-- 顯式鎖
SELECT * FROM users WHERE id = 1 FOR UPDATE;-- 共享鎖
SELECT * FROM users WHERE id = 1 FOR SHARE;-- 咨詢鎖
SELECT pg_advisory_lock(12345);
-- 執行操作
SELECT pg_advisory_unlock(12345);

性能優化

1. 索引優化

-- 創建復合索引
CREATE INDEX idx_users_name_age ON users(username, age);-- 部分索引
CREATE INDEX idx_active_users ON users(username) WHERE status = 'active';-- 表達式索引
CREATE INDEX idx_lower_username ON users (lower(username));-- 覆蓋索引
CREATE INDEX idx_users_covering ON users(username, email, age);

2. 查詢優化

-- 使用EXPLAIN分析查詢
EXPLAIN SELECT * FROM users WHERE username = 'john';-- 使用EXPLAIN ANALYZE
EXPLAIN ANALYZE SELECT * FROM users WHERE age > 25;-- 使用CTE優化復雜查詢
WITH active_users AS (SELECT * FROM users WHERE status = 'active'
)
SELECT * FROM active_users WHERE age > 25;

3. 配置優化

-- 內存配置
shared_buffers = 256MB
effective_cache_size = 1GB
work_mem = 4MB
maintenance_work_mem = 64MB-- 并發配置
max_connections = 100
max_worker_processes = 8
max_parallel_workers = 8

備份與恢復

1. 邏輯備份

# 備份整個數據庫
pg_dump mydb > backup.sql# 備份特定表
pg_dump -t users -t posts mydb > backup.sql# 壓縮備份
pg_dump mydb | gzip > backup.sql.gz

2. 恢復

# 恢復數據庫
psql mydb < backup.sql# 從壓縮文件恢復
gunzip -c backup.sql.gz | psql mydb

3. 物理備份

# 使用pg_basebackup
pg_basebackup -D /backup/data -Ft -z -P

復制

1. 主從復制

# 主服務器配置
wal_level = replica
max_wal_senders = 3
wal_keep_segments = 64# 從服務器配置
primary_conninfo = 'host=master_ip port=5432 user=replicator password=secret'

2. 邏輯復制

-- 主服務器
CREATE PUBLICATION my_publication FOR TABLE users, posts;-- 從服務器
CREATE SUBSCRIPTION my_subscriptionCONNECTION 'host=master_ip port=5432 dbname=mydb user=replicator password=secret'PUBLICATION my_publication;

與Python集成

使用psycopg2

import psycopg2
import psycopg2.extras# 連接數據庫
conn = psycopg2.connect(host="localhost",database="mydb",user="postgres",password="password"
)# 創建游標
cur = conn.cursor(cursor_factory=psycopg2.extras.RealDictCursor)# 執行查詢
cur.execute("SELECT * FROM users WHERE age > %s", (25,))
users = cur.fetchall()# 插入數據
cur.execute("INSERT INTO users (username, email, age) VALUES (%s, %s, %s) RETURNING id",("newuser", "new@example.com", 30)
)
user_id = cur.fetchone()['id']# 提交事務
conn.commit()# 關閉連接
cur.close()
conn.close()

使用SQLAlchemy

from sqlalchemy import create_engine, Column, Integer, String, DateTime
from sqlalchemy.ext.declarative import declarative_base
from sqlalchemy.orm import sessionmaker# 創建引擎
engine = create_engine('postgresql://postgres:password@localhost/mydb')# 創建基類
Base = declarative_base()# 定義模型
class User(Base):__tablename__ = 'users'id = Column(Integer, primary_key=True)username = Column(String(50), unique=True)email = Column(String(100), unique=True)age = Column(Integer)created_at = Column(DateTime)# 創建會話
Session = sessionmaker(bind=engine)
session = Session()# 查詢
users = session.query(User).filter(User.age > 25).all()# 添加
new_user = User(username='test', email='test@example.com', age=30)
session.add(new_user)
session.commit()

常見應用場景

  1. 企業級應用:ERP、CRM系統
  2. 金融系統:銀行、保險、證券
  3. 電商平臺:商品管理、訂單系統
  4. 內容管理:CMS、博客系統
  5. 數據分析:數據倉庫、報表系統

優缺點分析

優點

  • 功能完整,符合標準
  • 擴展性強
  • 性能優秀
  • 社區活躍
  • 開源免費

缺點

  • 配置復雜
  • 內存占用較高
  • 學習曲線陡峭
  • 某些操作性能不如MySQL

學習資源推薦

  • 官方文檔:https://www.postgresql.org/docs/
  • 在線教程:PostgreSQL Tutorial
  • 書籍:《PostgreSQL實戰》、《PostgreSQL技術內幕》
  • 實踐項目:企業級CRM系統、數據分析平臺

總結

PostgreSQL作為企業級關系型數據庫,憑借其強大的功能、優秀的性能和良好的擴展性,成為企業級應用的首選。無論是復雜的事務處理、數據分析還是地理空間應用,PostgreSQL都能提供完整的解決方案。對于需要高可靠性和功能完整性的企業應用,PostgreSQL是最佳選擇之一。

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/web/94168.shtml
繁體地址,請注明出處:http://hk.pswp.cn/web/94168.shtml
英文地址,請注明出處:http://en.pswp.cn/web/94168.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

FFMPEG相關解密,打水印,合并,推流,

1&#xff1a;ffmepg進行打水印解密 前提ffmepg安裝利用靜態版就可以這個什么都有&#xff0c;不用再配置其他信息&#xff1a;&#xff08;這個利用ffmpeg終端命令是沒問題的&#xff0c;但是如果要是再C中調用ffmpeg庫那么還需要從新編譯安裝下&#xff09; 各個版本 Inde…

MySql知識梳理之DML語句

注意: 插入數據時&#xff0c;指定的字段順序需要與值的順序是一一對應的。 字符串和日期型數據應該包含在引號中。 插入的數據大小&#xff0c;應該在字段的規定范圍內注意:修改語句的條件可以有&#xff0c;也可以沒有&#xff0c;如果沒有條件&#xff0c;則會修改整張表的所…

GaussDB GaussDB 數據庫架構師修煉(十八)SQL引擎-SQL執行流程

1 SQL執行流程查詢解析&#xff1a;詞法分析、語法分析、 語義分析 查詢重寫&#xff1a;視圖和規則展開、基于規則的查詢優化 計劃生成&#xff1a;路徑搜索和枚舉、選出最優執行計劃 查詢執行&#xff1a;基于優化器生成的物理執行計劃對數據進行獲取和計算2 解析器和優化器S…

grpc 1.45.2 在ubuntu中的編譯

要在 Ubuntu 上編譯 gRPC 1.45.2&#xff0c;需要按照以下步驟操作。以下指南基于 gRPC 官方文檔和相關資源&#xff0c;確保環境配置正確并成功編譯。請確保你有管理員權限&#xff08;sudo&#xff09;以安裝依賴項和執行相關命令。 1. 準備環境 確保你的 Ubuntu 系統已安裝…

lesson45:Linux基礎入門指南:從內核到實踐操作全解析

目錄 一、Linux簡介與核心概念 1.1 Linux的起源與發展 1.2 內核與發行版的關系 二、Linux內核版本解析 2.1 內核版本命名規則 2.2 2025年主流內核版本 三、主流Linux發行版對比 3.1 桌面用戶首選 Ubuntu 24.04 LTS Linux Mint 22 3.2 技術愛好者之選 Fedora 41 Ar…

PCL點云庫入門(第24講)——PCL庫點云特征之NARF特征描述 Normal Aligned Radial Feature(NARF)

一、算法原理 1、NARF 特征概述 NARF(Normal Aligned Radial Feature)是 2011 年由 Bastian Steder 等人在論文 《Point Feature Extraction on 3D Range Scans Taking into Account Object Boundaries》中提出的一種 稀疏局部 3D 特征描述子。 核心目標是提取具有“邊界意…

使用 eventpp 構建跨 RT-Thread 與 ARM-Linux 的輕量級 Active Object(AO)事件驅動框架

0. 引言 本文展示一個實踐路徑&#xff1a;以輕量級 C 事件庫 eventpp 為核心&#xff0c;設計并實現一個面向嵌入式的、可移植的 Active Object&#xff08;AO&#xff09;事件驅動架構。該架構滿足以下目標&#xff1a; 跨平臺兼容&#xff1a;單套代碼在 RT-Thread&#xff…

【python實用小腳本-193】Python全能PDF小助手:剪切/合并/旋轉/加密一條龍——再也不用開會員

Python全能PDF小助手&#xff1a;剪切/合并/旋轉/加密一條龍——再也不用開會員 PDF編輯, 本地處理, 零會員費, 多功能腳本, 瑞士軍刀 故事開場&#xff1a;一把瑞士軍刀救了周五下班的你 周五 17:55&#xff0c;老板甩來一堆 PDF&#xff1a; “把第 3、7 頁刪掉”“再和合同合…

Ubuntu根分區擴容

目錄 1.先查看/dev/sda 整塊磁盤設備的分區占用情況&#xff1a; 2.在VMware中編輯虛擬機&#xff1a; 3.進入虛擬機&#xff0c;進入disk應用程序&#xff1a; 4.擴容文件系統 5.最后通過df-h lsblk或通過可視化GParted進行驗證。 1.先查看/dev/sda 整塊磁盤設備的分區占…

智慧城市SaaS平臺/市政設施運行監測系統之空氣質量監測系統、VOC氣體監測系統、污水水質監測系統及環衛車輛定位調度系統架構內容

1. 空氣質量監測系統1) 監測點管理 a) 監測點基本信息 支持記錄空氣質量監測點的名稱、位置、類型、設備配置等信息。 b) 監測點分布地圖 支持通過GIS地圖展示監測點的分布情況&#xff0c;支持地圖查詢和導航。 2) 空氣質量監測 a) 實時數據采集 支持實時采集空氣質量數據&…

PiscCode迅速集成YOLO-Pose 實現姿態關鍵點軌跡跟蹤應用

在計算機視覺領域&#xff0c;人體姿態檢測與軌跡跟蹤是很多應用場景的核心技術&#xff0c;例如運動分析、行為識別、智能監控等。本文將介紹如何在 PiscCode 平臺上&#xff0c;利用 YOLO-Pose 模型進行姿態估計&#xff0c;并實現多人關鍵點軌跡跟蹤。 一、什么是 PiscCode …

HTTP的狀態碼有哪些,并用例子說明一下

問題HTTP的狀態碼有哪些&#xff0c;并用例子說明一下我的回答HTTP狀態碼是服務器對客戶端請求的響應碼&#xff0c;它們按照不同的功能被分為五大類。我來介紹一下主要的狀態碼及其實際應用場景&#xff1a;1xx&#xff08;信息性狀態碼&#xff09;&#xff1a;表示請求已接收…

【51單片機】【protues仿真】基于51單片機寵物投食器系統

目錄 一、主要功能 二、使用步驟 三、硬件資源 四、軟件設計 五、實驗現象 一、主要功能 1、LCD1602液晶顯示當前時間 2、按鍵設置時間&#xff0c;5個定時投喂時間? 3、可以通過手動按鍵進行投喂食物 4、步進電機模擬投喂食物 二、使用步驟 基于51單片機的寵物自動投…

掌握設計模式--命令模式

命令模式&#xff08;Command Pattern&#xff09; 命令模式&#xff08;Command Pattern&#xff09;是一種行為型設計模式&#xff0c;它將請求&#xff08;命令&#xff09;封裝成對象&#xff0c;從而使您能夠參數化客戶端&#xff08;調用者&#xff09;使用不同的請求、…

STM32之beep、多文件、延遲、按鍵以及呼吸燈

一、Beep控制 原理圖分析&#xff1a; 蜂鳴器三極管控制引腳對應 MCU PB8。當前蜂鳴器對應的電路中&#xff0c;三極管是 NPN 三極管&#xff0c;當前【基極】存在小電流&#xff0c;當前三極管導通。要求對應 PB8 引腳對外輸出電壓 / 電流。當前 PB8 輸出高電平&#xff0c;當…

C++的struct里面可以放函數,討論一下C++和C關于struct的使用區別

我們來看一個C代碼下面的struct結構體: struct UserValue {float lx;float ly;float rx;float ry;float L2;// 【構造函數】UserValue() {setZero();}// 【成員函數】void setZero() {lx 0;ly 0;rx 0;ry 0;L2 0;} };在這篇文章中&#xff0c;我們將來詳細解釋一下為什么 U…

【Kubernetes知識點】資源配額與訪問控制

目錄 1.解釋ResourceQuota的作用。 2.解釋Service Account的用途。 3.詳細解釋Role和ClusterRole。 4.什么是K8s的NetworkPolicy&#xff1f; 5.詳細描述在K8s中如何控制跨Namespace的Pod訪問&#xff1f; 1.解釋ResourceQuota的作用。 ResourceQuota&#xff08;資源配額…

在SAP Query中添加雙擊事件

在SAP系統中&#xff0c;SAP Query是一個強大的工具&#xff0c;允許用戶自定義報告以滿足特定的數據查詢需求。它提供了靈活的報表設計功能&#xff0c;使非編程背景的用戶也能創建和修改查詢。在某些情況下&#xff0c;我們可能希望在查詢結果上添加交互性&#xff0c;比如通…

c++:MFC中sqlite3的使用(附實際案例)

MFC中sqlite3的使用sqlite3介紹sqlite3安裝常用API函數操作流程接口函數執行sql語句函數回調函數MFC中案例實踐控制臺實踐sqlite3介紹 SQLite 是一個軟件庫&#xff0c;實現了自給自足的、無服務器的、零配置的、事務性的 SQL 數據庫引擎。SQLite 是在世界上最廣泛部署的 SQL …

LeetCode第1019題 - 鏈表中的下一個更大節點

題目 解答 class Solution {Stack<Integer> stack new Stack<>();List<Integer> values new LinkedList<>();public int[] nextLargerNodes(ListNode head) {nextLargerNodes2(head);return values.stream().mapToInt(x -> x).toArray();}publi…