bean.py 3.6 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126
  1. # -*- coding:utf-8 -*-
  2. __author__ = 'Ulric Qin'
  3. from rrd.store import db
  4. class Bean(object):
  5. _tbl = ''
  6. _id = 'id'
  7. _cols = ''
  8. @classmethod
  9. def insert(cls, data=None):
  10. if not data:
  11. raise ValueError('argument data is invalid')
  12. size = len(data)
  13. keys = data.keys()
  14. safe_keys = ['`%s`' % k for k in keys]
  15. sql = 'INSERT INTO `%s`(%s) VALUES(%s)' % (cls._tbl, ','.join(safe_keys), '%s' + ',%s' * (size - 1))
  16. last_id = db.insert(sql, [data[key] for key in keys])
  17. return last_id
  18. @classmethod
  19. def delete(cls, where=None, params=None):
  20. sql = 'DELETE FROM `%s`' % cls._tbl
  21. if not where:
  22. return db.update(sql)
  23. sql += ' WHERE ' + where
  24. return db.update(sql, params)
  25. @classmethod
  26. def delete_one(cls, pk=None):
  27. sql = 'DELETE FROM `%s` WHERE %s = %%s' % (cls._tbl, cls._id)
  28. return db.update(sql, [pk])
  29. @classmethod
  30. def update(cls, clause=None, params=None):
  31. sql = 'UPDATE `%s` SET %s' % (cls._tbl, clause)
  32. return db.update(sql, params)
  33. @classmethod
  34. def update_dict(cls, data=None, where='', params=None):
  35. if not data:
  36. raise ValueError('argument data is invalid')
  37. size = len(data)
  38. keys = data.keys()
  39. safe_keys = ['`%s`' % k for k in keys]
  40. values = [data[key] for key in keys]
  41. arr = ['%s=%%s' % key for key in safe_keys]
  42. if not where:
  43. return cls.update(','.join(arr), values)
  44. else:
  45. values.extend(params)
  46. return cls.update(', '.join(arr) + ' WHERE ' + where, values)
  47. @classmethod
  48. def select(cls, cols=None, where=None, params=None, order=None, limit=None, page=None, offset=None):
  49. if cols is None:
  50. cols = cls._cols
  51. if params is None:
  52. params = []
  53. sql = 'SELECT %s FROM `%s`' % (cols, cls._tbl)
  54. if where:
  55. sql = '%s WHERE %s' % (sql, where)
  56. if order:
  57. sql = '%s ORDER BY %s' % (sql, order)
  58. if limit is not None:
  59. sql = '%s LIMIT %s' % (sql, limit)
  60. if offset is not None:
  61. sql = '%s OFFSET %s' % (sql, offset)
  62. if page is not None:
  63. offset = (int(page) - 1) * int(limit)
  64. if offset < 0:
  65. offset = 0
  66. sql = '%s OFFSET %s' % (sql, offset)
  67. return db.query_all(sql, params)
  68. @classmethod
  69. def select_vs(cls, where=None, params=None, order=None, limit=None, page=None, offset=None):
  70. rows = cls.select(where=where, params=params, order=order, limit=limit, page=page, offset=offset)
  71. return [cls(*row) for row in rows]
  72. @classmethod
  73. def read(cls, where=None, params=None):
  74. vs = cls.select_vs(where=where, params=params)
  75. if vs:
  76. return vs[0]
  77. else:
  78. return None
  79. @classmethod
  80. def get(cls, id_val):
  81. if not id_val:
  82. return None
  83. return cls.read('%s = %%s' % cls._id, [id_val])
  84. @classmethod
  85. def column(cls, col=None, where=None, params=None, order=None, limit=None, page=None, offset=None):
  86. rows = cls.select(col, where, params, order, limit, page, offset)
  87. return [row[0] for row in rows]
  88. @classmethod
  89. def total(cls, where=None, params=None):
  90. sql = 'SELECT COUNT(1) FROM `%s`' % cls._tbl
  91. if not where:
  92. ret = db.query_column(sql)
  93. return ret[0]
  94. sql += ' WHERE ' + where
  95. ret = db.query_column(sql, params)
  96. return ret[0]
  97. @classmethod
  98. def exists(cls, where=None, params=None):
  99. return cls.total(where, params) > 0