/owllook/database/mongodb/motorbase.py

https://github.com/howie6879/owllook
Python | 140 lines | 127 code | 4 blank | 9 comment | 0 complexity | 0a4124b0b4b07d49f659985046622264 MD5 | raw file
  1. #!/usr/bin/env python
  2. import asyncio
  3. from pymongo import MongoClient
  4. from motor.motor_asyncio import AsyncIOMotorClient
  5. from owllook.config import CONFIG
  6. from owllook.utils.tools import singleton
  7. @singleton
  8. class MotorBase:
  9. """
  10. 更改mongodb连接方式 单例模式下支持多库操作
  11. About motor's doc: https://github.com/mongodb/motor
  12. """
  13. _db = {}
  14. _collection = {}
  15. MONGODB = CONFIG.MONGODB
  16. def __init__(self, loop=None):
  17. self.motor_uri = ''
  18. self.loop = loop or asyncio.get_event_loop()
  19. def client(self, db):
  20. # motor
  21. self.motor_uri = 'mongodb://{account}{host}:{port}/{database}'.format(
  22. account='{username}:{password}@'.format(
  23. username=self.MONGODB['MONGO_USERNAME'],
  24. password=self.MONGODB['MONGO_PASSWORD']) if self.MONGODB['MONGO_USERNAME'] else '',
  25. host=self.MONGODB['MONGO_HOST'] if self.MONGODB['MONGO_HOST'] else 'localhost',
  26. port=self.MONGODB['MONGO_PORT'] if self.MONGODB['MONGO_PORT'] else 27017,
  27. database=db)
  28. return AsyncIOMotorClient(self.motor_uri, io_loop=self.loop)
  29. def get_db(self, db=MONGODB['DATABASE']):
  30. """
  31. Get a db instance
  32. :param db: database name
  33. :return: the motor db instance
  34. """
  35. if db not in self._db:
  36. self._db[db] = self.client(db)[db]
  37. return self._db[db]
  38. def get_collection(self, db_name, collection):
  39. """
  40. Get a collection instance
  41. :param db_name: database name
  42. :param collection: collection name
  43. :return: the motor collection instance
  44. """
  45. collection_key = db_name + collection
  46. if collection_key not in self._collection:
  47. self._collection[collection_key] = self.get_db(db_name)[collection]
  48. return self._collection[collection_key]
  49. class MotorBaseOld:
  50. """
  51. use motor to connect mongodb
  52. 2017-09-21 deleted
  53. """
  54. _db = None
  55. MONGODB = CONFIG.MONGODB
  56. def client(self, db):
  57. # motor
  58. self.motor_uri = 'mongodb://{account}{host}:{port}/{database}'.format(
  59. account='{username}:{password}@'.format(
  60. username=self.MONGODB['MONGO_USERNAME'],
  61. password=self.MONGODB['MONGO_PASSWORD']) if self.MONGODB['MONGO_USERNAME'] else '',
  62. host=self.MONGODB['MONGO_HOST'] if self.MONGODB['MONGO_HOST'] else 'localhost',
  63. port=self.MONGODB['MONGO_PORT'] if self.MONGODB['MONGO_PORT'] else 27017,
  64. database=db)
  65. return AsyncIOMotorClient(self.motor_uri)
  66. @property
  67. def db(self):
  68. if self._db is None:
  69. self._db = self.client(self.MONGODB['DATABASE'])[self.MONGODB['DATABASE']]
  70. return self._db
  71. @singleton
  72. class PyMongoDb:
  73. _db = None
  74. MONGODB = {
  75. 'MONGO_HOST': '127.0.0.1',
  76. 'MONGO_PORT': '',
  77. 'MONGO_USERNAME': '',
  78. 'MONGO_PASSWORD': '',
  79. 'DATABASE': 'owllook'
  80. }
  81. def client(self):
  82. # motor
  83. self.mongo_uri = 'mongodb://{account}{host}:{port}/'.format(
  84. account='{username}:{password}@'.format(
  85. username=self.MONGODB['MONGO_USERNAME'],
  86. password=self.MONGODB['MONGO_PASSWORD']) if self.MONGODB['MONGO_USERNAME'] else '',
  87. host=self.MONGODB['MONGO_HOST'] if self.MONGODB['MONGO_HOST'] else 'localhost',
  88. port=self.MONGODB['MONGO_PORT'] if self.MONGODB['MONGO_PORT'] else 27017)
  89. return MongoClient(self.mongo_uri)
  90. @property
  91. def db(self):
  92. if self._db is None:
  93. self._db = self.client()[self.MONGODB['DATABASE']]
  94. return self._db
  95. if __name__ == '__main__':
  96. def async_callback(func, **kwargs):
  97. """
  98. Call the asynchronous function
  99. :param func: a async function
  100. :param kwargs: params
  101. :return: result
  102. """
  103. loop = asyncio.get_event_loop()
  104. task = asyncio.ensure_future(func(**kwargs))
  105. loop.run_until_complete(task)
  106. return task.result()
  107. motor_base = MotorBase()
  108. motor_db = motor_base.get_db()
  109. async def insert(data):
  110. print(data)
  111. await motor_db.test.save(data)
  112. async_callback(insert, data={'hi': 'owllook'})