Python使用SQLAlchemy訪問MemFireDB

gopherHerry 發表於 2021-06-26
Python SQL

之前看到一個帖子說的挺好,專案開發儘量不要自己造輪子,能用開源專案或者SAAS服務儘量用,很多事情都是跟時間賽跑。

最近在體驗 MemFire Cloud,如果大家有個人專案或者公司內部測試專案,推薦大家嘗試一下,挺方便的,不用自己搭建資料庫,在家或者公司隨時可以訪問,這是我的邀請碼:hm2tJQ hm3U69 Ry5YZj

SQLAlchemy是Python中最常用的訪問資料庫的ORM庫,MemFireDB相容Postgres介面,所以可以直接把MemFireDB當Postgres使用。

memfiredb.com 上建立資料庫時,可以選擇建立密碼或者證照兩種認證模式,在公網上部署的資料庫,如果儲存的是比較重要的資料,建議使用證照認證模式,該模式安全係數要高很多,撞庫、彩虹表、暴力破解等傳統的密碼破解方式對證照認證是無能為力的。如果只是簡單測試,可以使用密碼認證方式,這種方式配置簡單些。

言歸正傳,下面是SQLAlchemy使用證照連線MemFireDB的例子,建立完資料庫後,把下載的證照解壓到程式碼同級的目錄就可以了,記得將host、port、dbname、dbuser設定為對應的值:

# -*- coding: utf-8 -*-

import sys

from sqlalchemy.ext.declarative import declarative_base
from sqlalchemy import Column, Integer
from sqlalchemy import create_engine
from sqlalchemy.orm import sessionmaker
import sqlalchemy.engine.url as url


Base = declarative_base()


class Counter(Base):
    __tablename__ = 'counters'

    id = Column(Integer, primary_key=True)
    counter = Column(Integer)


engine = None


def init_db_engine(host, port, dbname, user, ssl_ca, ssl_cert, ssl_key):
    global engine
    uri = url.URL(
        drivername="postgresql",
        host=host,
        port=port,
        username=user,
        database=dbname,
    )

    ssl_args = {
        "sslmode": "verify-ca",
        "sslrootcert": ssl_ca,
        "sslcert": ssl_cert,
        "sslkey": ssl_key
    }
    print ssl_args
    engine = create_engine(uri, connect_args=ssl_args, encoding='utf-8', echo=False,
                           pool_size=100, pool_recycle=3600, pool_pre_ping=True)


def get_session():
    global engine
    SessionCls = sessionmaker(bind=engine)
    return SessionCls()


def main():
    host = sys.argv[1]
    port = int(sys.argv[2])
    dbname = sys.argv[3]
    dbuser = sys.argv[4]

    init_db_engine(host, port, dbname, dbuser, './root.crt', './memfiredb.crt', './memfiredb.key')
    Base.metadata.create_all(engine)

    session = get_session()
    session.execute('delete from counters')
    cnt = Counter(counter=1)
    session.add(cnt)
    session.commit()
    session.close()


if __name__ == '__main__':
    main()
本作品採用《CC 協議》,轉載必須註明作者和本文連結