Guest User

Untitled

a guest
Jan 7th, 2019
691
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 2.72 KB | None | 0 0
  1. person = {
  2. 'name': 'John Doe',
  3. 'email': 'johndoe@email.com',
  4. 'age': 50,
  5. 'connected': False
  6. }
  7.  
  8. dict_a = {
  9. 'name': {
  10. 'first_name': 'John',
  11. 'last_name': 'Doe'
  12. },
  13. 'workEmail': 'johndoe@email.com',
  14. 'age': 50,
  15. 'connected': False
  16. }
  17.  
  18. dict_b = {
  19. 'fullName': 'John Doe',
  20. 'workEmail': 'johndoe@email.com',
  21. 'age': 50,
  22. 'connected': False
  23. }
  24.  
  25. """
  26. Database mapping declarations for SQLAlchemy
  27. """
  28.  
  29. from sqlalchemy import Column, Integer, String, Boolean
  30. from database.connection import Base
  31.  
  32. class PersonModel(Base):
  33. __tablename__ = 'Person'
  34. id = Column(Integer, primary_key=True)
  35. name = Column(String)
  36. email = Column(String)
  37. age = Column(Integer)
  38. connected = Column(Boolean)
  39.  
  40. """
  41. Data mappers for Person
  42. """
  43.  
  44. # Abstract class for mapper
  45. class Mapper(object):
  46. def __init__(self, data):
  47. self.data = data
  48.  
  49. # Data mapper for format A, maps the fields from dict_a to Person
  50. class MapperA(Mapper):
  51. def __init__(self, data):
  52. self.name = ' '.join([data.get('name').get(key) for key in ['first_name', 'last_name']])
  53. self.email = data.get('workEmail')
  54. self.age = data.get('age')
  55. self.connected = data.get('connected')
  56.  
  57. @classmethod
  58. def is_mapper_for(cls, data):
  59. return all(key in data for key in ('name', 'workEmail'))
  60.  
  61. # Data mapper for format B, maps the fields from dict_b to Person
  62. class MapperB(Mapper):
  63. def __init__(self, data):
  64. self.name = data.get('fullName')
  65. self.email = data.get('workEmail')
  66. self.age = data.get('age')
  67. self.connected = data.get('connected')
  68.  
  69. @classmethod
  70. def is_mapper_for(cls, data):
  71. return all(key in data for key in ('fullName', 'workEmail'))
  72.  
  73. # Creates a Person instance base on the input data mapping
  74. def Person(data):
  75. for cls in Mapper.__subclasses__():
  76. if cls.is_mapper_for(data):
  77. return cls(data)
  78. raise NotImplementedError
  79.  
  80.  
  81. if __name__ == '__main__':
  82. from database.connection import make_session
  83. from database.models import PersonModel
  84.  
  85. # Sample data for example
  86. dict_a = {
  87. 'name': {
  88. 'first_name': 'John',
  89. 'last_name': 'Doe'
  90. },
  91. 'workEmail': 'johndoe@email.com',
  92. 'age': 50,
  93. 'connected': False
  94. }
  95. dict_b = {
  96. 'fullName': 'John Doe',
  97. 'workEmail': 'johndoe@email.com',
  98. 'age': 50,
  99. 'connected': False
  100. }
  101.  
  102. # Instantiate Person from data
  103. persons = [Person(data) for data in [dict_a, dict_b]]
  104.  
  105. # Store persons that fit the database model
  106. persons = [PersonModel(**person.__dict__) for person in persons]
  107. with make_session() as session:
  108. session.add_all(persons)
  109. session.commit()
Add Comment
Please, Sign In to add comment