架构设计
7748
之前看到一个帖子说的挺好,项目开发尽量不要自己造轮子,能用开源项目或者SAAS服务尽量用,很多事情都是跟时间赛跑。
如果大家有个人项目或者公司内部测试项目,MemFire Cloud,推荐大家尝试一下,挺方便的,不用自己搭建数据库,在家或者公司随时可以访问。
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()