之前看到一個(gè)帖子說的挺好甥捺,項(xiàng)目開發(fā)盡量不要自己造輪子兆衅,能用開源項(xiàng)目或者SAAS服務(wù)盡量用烛谊,很多事情都是跟時(shí)間賽跑风响。
最近在體驗(yàn) MemFire Cloud,如果大家有個(gè)人項(xiàng)目或者公司內(nèi)部測試項(xiàng)目丹禀,推薦大家嘗試一下状勤,挺方便的,不用自己搭建數(shù)據(jù)庫双泪,在家或者公司隨時(shí)可以訪問持搜,這是我的邀請碼:hm2tJQ hm3U69
SQLAlchemy是Python中最常用的訪問數(shù)據(jù)庫的ORM庫,MemFireDB兼容Postgres接口焙矛,所以可以直接把MemFireDB當(dāng)Postgres使用葫盼。
在https://memfiredb.com上創(chuàng)建數(shù)據(jù)庫時(shí),可以選擇創(chuàng)建密碼或者證書兩種認(rèn)證模式村斟,在公網(wǎng)上部署的數(shù)據(jù)庫贫导,如果存儲(chǔ)的是比較重要的數(shù)據(jù),建議使用證書認(rèn)證模式蟆盹,該模式安全系數(shù)要高很多孩灯,撞庫、彩虹表逾滥、暴力破解等傳統(tǒng)的密碼破解方式對證書認(rèn)證是無能為力的峰档。如果只是簡單測試,可以使用密碼認(rèn)證方式寨昙,這種方式配置簡單些讥巡。
言歸正傳,下面是SQLAlchemy使用證書連接MemFireDB的例子舔哪,創(chuàng)建完數(shù)據(jù)庫后欢顷,把下載的證書解壓到代碼同級的目錄就可以了,記得將host尸红、port吱涉、dbname、dbuser設(shè)置為對應(yīng)的值:
# -*- 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()