schema.py 2.2 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263
  1. from django.db.backends.schema import BaseDatabaseSchemaEditor
  2. class DatabaseSchemaEditor(BaseDatabaseSchemaEditor):
  3. sql_create_sequence = "CREATE SEQUENCE %(sequence)s"
  4. sql_delete_sequence = "DROP SEQUENCE IF EXISTS %(sequence)s CASCADE"
  5. sql_set_sequence_max = "SELECT setval('%(sequence)s', MAX(%(column)s)) FROM %(table)s"
  6. def quote_value(self, value):
  7. # Inner import so backend fails nicely if it's not present
  8. import psycopg2
  9. return psycopg2.extensions.adapt(value)
  10. def _alter_column_type_sql(self, table, column, type):
  11. """
  12. Makes ALTER TYPE with SERIAL make sense.
  13. """
  14. if type.lower() == "serial":
  15. sequence_name = "%s_%s_seq" % (table, column)
  16. return (
  17. (
  18. self.sql_alter_column_type % {
  19. "column": self.quote_name(column),
  20. "type": "integer",
  21. },
  22. [],
  23. ),
  24. [
  25. (
  26. self.sql_delete_sequence % {
  27. "sequence": sequence_name,
  28. },
  29. [],
  30. ),
  31. (
  32. self.sql_create_sequence % {
  33. "sequence": sequence_name,
  34. },
  35. [],
  36. ),
  37. (
  38. self.sql_alter_column % {
  39. "table": table,
  40. "changes": self.sql_alter_column_default % {
  41. "column": column,
  42. "default": "nextval('%s')" % sequence_name,
  43. }
  44. },
  45. [],
  46. ),
  47. (
  48. self.sql_set_sequence_max % {
  49. "table": table,
  50. "column": column,
  51. "sequence": sequence_name,
  52. },
  53. [],
  54. ),
  55. ],
  56. )
  57. else:
  58. return super(DatabaseSchemaEditor, self)._alter_column_type_sql(table, column, type)