Chào các bạn trong diễn đàn,
Dạo này mình đang có nhu cầu đẩy dữ liệu từ file Excel (định kỳ hàng ngày) lên một CSDL PostgreSQL để tiện cho việc phân tích và báo cáo sâu hơn. Mình đã thử qua Power Query nhưng cảm thấy hơi hạn chế khi xử lý các logic phức tạp và cần tùy biến cao. Sau một thời gian tìm hiểu, mình phát hiện ra có thể dùng Python để làm việc này khá hiệu quả.
Mình muốn chia sẻ với mọi người một cách thức đơn giản để tự động hóa việc này, hy vọng có thể giúp ích cho ai đó đang gặp tình huống tương tự.
Các bước thực hiện:
- Chuẩn bị dữ liệu Excel: Đảm bảo file Excel của bạn có cấu trúc rõ ràng, mỗi cột có tiêu đề.
- Cài đặt thư viện Python: Cần cài đặt
pandasđể đọc file Excel vàpsycopg2để kết nối với PostgreSQL. Bạn có thể cài đặt bằng pip:pip install pandas psycopg2-binary
- Viết script Python:
import pandas as pd
import psycopg2
# Thông tin kết nối PostgreSQL
db_params = {
'database': 'your_db',
'user': 'your_user',
'password': 'your_password',
'host': 'localhost',
'port': '5432'
}
# Đường dẫn đến file Excel
excel_file = 'your_data.xlsx'
try:
# Đọc dữ liệu từ Excel
df = pd.read_excel(excel_file)
# Kết nối tới PostgreSQL
conn = psycopg2.connect(**db_params)
cur = conn.cursor()
# Tạo câu lệnh SQL INSERT (thay 'your_table' bằng tên bảng của bạn)
# Giả định các cột trong Excel khớp với các cột trong bảng PostgreSQL
cols = "",join(df.columns)
placeholders = ",".join(["%s"] * len(df.columns))
insert_query = f"INSERT INTO your_table ({cols}) VALUES ({placeholders})"
# Thực thi câu lệnh INSERT cho từng dòng dữ liệu
for index, row in df.iterrows():
cur.execute(insert_query, tuple(row))
# Lưu thay đổi
conn.commit()
print("Dữ liệu đã được tải lên PostgreSQL thành công!")
except (Exception, psycopg2.Error) as error:
print(f"Lỗi khi tải dữ liệu: {error}")
finally:
# Đóng kết nối
if conn:
cur.close()
conn.close()
print("Kết nối PostgreSQL đã đóng.")
Cách này giúp mình tiết kiệm rất nhiều thời gian và giảm thiểu sai sót so với việc nhập liệu thủ công. Hy vọng chia sẻ này hữu ích cho mọi người!
Có bạn nào có kinh nghiệm hoặc cách làm khác hiệu quả hơn, chia sẻ cùng mình nhé!