Clever cloud postgreSQL申請流程

前言

資料庫介紹

資料庫(此為關聯式資料庫)的主要用途是為資料提供一個儲存空間,讓使用者可以進行讀取、寫入、修改、刪除等功能。

關聯式資料庫常見如下:

  • MySQL 和 PostgreSQL 是開源且廣泛使用的選擇,適合中小型應用程式
  • Microsoft SQL Server 通常用於大型企業解決方案
  • SQLite 則是一個輕量級的資料庫,適合用於嵌入式應用或單機應用。

申請雲端服務

本篇文章介紹的部分為Clever Cloud 所提供無料的 256MB PostgreSQL 服務,適合需要基本資料庫功能的小型應用程式。

重要參數

當您成功註冊並啟用 PostgreSQL 服務後,只需要取得一項重要參數 CONNECTION_URI即可開始使用雲端資料庫。

進入網站

Clever-Coud

註冊

Fig1. 登入頁面

註冊方式:

  1. email
  2. Github
Fig2. 登入頁面2

入口畫面

Fig3. 入口畫面

需要先去驗證你的email是否正確

Fig4. 驗證信內容

新增一個addon

Fig5. 新建按鈕

選取PostgreSQL

Fig6. 資料庫服務

指定計畫名稱為DEV,最右下角有一個next

Fig7. 選擇內容DEV

填寫名稱

Fig8. 服務名稱

服務成功建立

Fig9. 資料庫管理介面

結論

上述結論就可以得到一組 Connection URI,這就可以拿來當作其他網站的資料庫使用了!!

256MB雖然沒有很大,但是可以塞大概58萬條純文字紀錄,一般開發上來說滿夠的。

串接範例

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
from sqlalchemy import create_engine, Column, Integer, String, DateTime, JSON, UniqueConstraint, ForeignKey
from sqlalchemy.orm import sessionmaker,declarative_base, relationship
from datetime import datetime
from sqlalchemy.orm import Session
from sqlalchemy import select,text
import pytz

# PostgreSQL 配置(改成你的)
DATABASE_URL="postgresql://uizbhnmkOOOOOO:K0r18XtU1Nb2yGwC1SfwoOOOOOOO@bngbuvea6wkwlOOOg-postgresql.services.clever-cloud.com:50OOO/bngbuvea6wOOOOOOhzig"


engine = create_engine(DATABASE_URL)
SessionLocal = sessionmaker(autocommit=False, autoflush=False, bind=engine)

# DATABASE_URL2="sqlite:///members.db"
# engine2 = create_engine(DATABASE_URL2)
# SessionLocal2 = sessionmaker(autocommit=False, autoflush=False, bind=engine2)

Base = declarative_base()
# 定義數據庫模型
class Photo(Base):
__tablename__ = 'photos_backup'
id = Column(Integer, primary_key=True, index=True)
user_id = Column(String(255))
group_id = Column(String(255))
photo_name = Column(String(255))
photo_url = Column(String(255))
photo_thumbnail_url = Column(String(255))
place_tmp= Column(String(50))
created_time = Column(DateTime, default=lambda: datetime.now(pytz.timezone('Asia/Taipei')))
photo_properties = Column(JSON)
photo_image_hash = Column(String(255))#, unique=True, nullable=False)

Base.metadata.create_all(bind=engine)

def add_photo(user_id, group_id, photo_name, photo_url, photo_thumbnail_url, place_tmp, photo_properties, photo_image_hash):
# 創建一個新的數據庫會話
db: Session = SessionLocal()
try:
# 創建 Photo 實例
new_photo = Photo(
user_id=user_id,
group_id=group_id,
photo_name=photo_name,
photo_url=photo_url,
photo_thumbnail_url=photo_thumbnail_url,
place_tmp=place_tmp,
photo_properties=photo_properties,
photo_image_hash=photo_image_hash
)

# 將新實例添加到會話中
db.add(new_photo)

# 提交會話以保存更改
db.commit()

# 刷新會話以獲取新資料的 ID
db.refresh(new_photo)

print(f"新增照片資料成功,ID: {new_photo.id}")
except Exception as e:
# 如果發生錯誤,回滾事務
db.rollback()
print(f"新增照片資料失敗: {e}")
finally:
# 關閉會話
db.close()

def get_all_photos():
# 創建一個新的數據庫會話
db: Session = SessionLocal()
try:
# 獲取所有照片資料
photos = db.query(Photo).all()
return photos
except Exception as e:
# 如果發生錯誤,回滾事務
db.rollback()
print(f"獲取照片資料失敗: {e}")
finally:
# 關閉會話
db.close()

def delete_photo_by_id(photo_id):
# 創建一個新的數據庫會話
db: Session = SessionLocal()
try:
# 透過 ID 刪除照片資料
db.query(Photo).filter(Photo.id == photo_id).delete()
db.commit()
print(f"刪除照片資料成功,ID: {photo_id}")
except Exception as e:
# 如果發生錯誤,回滾事務
db.rollback()
print(f"刪除照片資料失敗: {e}")
finally:
# 關閉會話
db.close()

# 使用範例
add_photo(
user_id="user_123",
group_id="group_456",
photo_name="example_photo.jpg",
photo_url="http://example.com/photo.jpg",
photo_thumbnail_url="http://example.com/photo_thumb.jpg",
place_tmp="Taipei",
photo_properties={"description": "A beautiful sunset."},
photo_image_hash="hash_value_example"
)

photos = get_all_photos()
print(photos)

delete_photo_by_id(1)

session = SessionLocal()

try:
# 使用原生 SQL 執行 ALTER TABLE,並使用 text() 包裝 SQL 語句
# session.execute(text("ALTER TABLE photos_backup ADD COLUMN description TEXT"))
session.execute(text("DROP TABLE IF EXISTS photos_backup"))
session.commit()
except Exception as e:
print(f"出錯了: {e}")
session.rollback()
finally:
session.close()

遭遇問題紀錄

當介面的PG Studio無法登入時,會無法操作資料庫中的所有內容,儘管用pgadmin來進行也會出現'ServerManager'沒有存在user_info之類的錯誤訊息。

我用streamlit建立一個介面去進行操作也無法成功(後來操作成功了!?)

VScode進行連接時會出現pg_table無法顯示

總言之就是一個很無解的過程,看來雲端服務也不一定是好的方案,能夠完整掌握會比較安全