test_autogen_diffs.py 8.2 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273
  1. from sqlalchemy import BigInteger
  2. from sqlalchemy import Column
  3. from sqlalchemy import Integer
  4. from sqlalchemy import MetaData
  5. from sqlalchemy import Table
  6. from sqlalchemy.testing import in_
  7. from ._autogen_fixtures import AutogenFixtureTest
  8. from ... import testing
  9. from ...testing import config
  10. from ...testing import eq_
  11. from ...testing import is_
  12. from ...testing import TestBase
  13. class AlterColumnTest(AutogenFixtureTest, TestBase):
  14. __backend__ = True
  15. @testing.combinations((True,), (False,))
  16. @config.requirements.comments
  17. def test_all_existings_filled(self, pk):
  18. m1 = MetaData()
  19. m2 = MetaData()
  20. Table("a", m1, Column("x", Integer, primary_key=pk))
  21. Table("a", m2, Column("x", Integer, comment="x", primary_key=pk))
  22. alter_col = self._assert_alter_col(m1, m2, pk)
  23. eq_(alter_col.modify_comment, "x")
  24. @testing.combinations((True,), (False,))
  25. @config.requirements.comments
  26. def test_all_existings_filled_in_notnull(self, pk):
  27. m1 = MetaData()
  28. m2 = MetaData()
  29. Table("a", m1, Column("x", Integer, nullable=False, primary_key=pk))
  30. Table(
  31. "a",
  32. m2,
  33. Column("x", Integer, nullable=False, comment="x", primary_key=pk),
  34. )
  35. self._assert_alter_col(m1, m2, pk, nullable=False)
  36. @testing.combinations((True,), (False,))
  37. @config.requirements.comments
  38. def test_all_existings_filled_in_comment(self, pk):
  39. m1 = MetaData()
  40. m2 = MetaData()
  41. Table("a", m1, Column("x", Integer, comment="old", primary_key=pk))
  42. Table("a", m2, Column("x", Integer, comment="new", primary_key=pk))
  43. alter_col = self._assert_alter_col(m1, m2, pk)
  44. eq_(alter_col.existing_comment, "old")
  45. @testing.combinations((True,), (False,))
  46. @config.requirements.comments
  47. def test_all_existings_filled_in_server_default(self, pk):
  48. m1 = MetaData()
  49. m2 = MetaData()
  50. Table(
  51. "a", m1, Column("x", Integer, server_default="5", primary_key=pk)
  52. )
  53. Table(
  54. "a",
  55. m2,
  56. Column(
  57. "x", Integer, server_default="5", comment="new", primary_key=pk
  58. ),
  59. )
  60. alter_col = self._assert_alter_col(m1, m2, pk)
  61. in_("5", alter_col.existing_server_default.arg.text)
  62. def _assert_alter_col(self, m1, m2, pk, nullable=None):
  63. ops = self._fixture(m1, m2, return_ops=True)
  64. modify_table = ops.ops[-1]
  65. alter_col = modify_table.ops[0]
  66. if nullable is None:
  67. eq_(alter_col.existing_nullable, not pk)
  68. else:
  69. eq_(alter_col.existing_nullable, nullable)
  70. assert alter_col.existing_type._compare_type_affinity(Integer())
  71. return alter_col
  72. class AutoincrementTest(AutogenFixtureTest, TestBase):
  73. __backend__ = True
  74. __requires__ = ("integer_subtype_comparisons",)
  75. def test_alter_column_autoincrement_none(self):
  76. m1 = MetaData()
  77. m2 = MetaData()
  78. Table("a", m1, Column("x", Integer, nullable=False))
  79. Table("a", m2, Column("x", Integer, nullable=True))
  80. ops = self._fixture(m1, m2, return_ops=True)
  81. assert "autoincrement" not in ops.ops[0].ops[0].kw
  82. def test_alter_column_autoincrement_pk_false(self):
  83. m1 = MetaData()
  84. m2 = MetaData()
  85. Table(
  86. "a",
  87. m1,
  88. Column("x", Integer, primary_key=True, autoincrement=False),
  89. )
  90. Table(
  91. "a",
  92. m2,
  93. Column("x", BigInteger, primary_key=True, autoincrement=False),
  94. )
  95. ops = self._fixture(m1, m2, return_ops=True)
  96. is_(ops.ops[0].ops[0].kw["autoincrement"], False)
  97. def test_alter_column_autoincrement_pk_implicit_true(self):
  98. m1 = MetaData()
  99. m2 = MetaData()
  100. Table("a", m1, Column("x", Integer, primary_key=True))
  101. Table("a", m2, Column("x", BigInteger, primary_key=True))
  102. ops = self._fixture(m1, m2, return_ops=True)
  103. is_(ops.ops[0].ops[0].kw["autoincrement"], True)
  104. def test_alter_column_autoincrement_pk_explicit_true(self):
  105. m1 = MetaData()
  106. m2 = MetaData()
  107. Table(
  108. "a", m1, Column("x", Integer, primary_key=True, autoincrement=True)
  109. )
  110. Table(
  111. "a",
  112. m2,
  113. Column("x", BigInteger, primary_key=True, autoincrement=True),
  114. )
  115. ops = self._fixture(m1, m2, return_ops=True)
  116. is_(ops.ops[0].ops[0].kw["autoincrement"], True)
  117. def test_alter_column_autoincrement_nonpk_false(self):
  118. m1 = MetaData()
  119. m2 = MetaData()
  120. Table(
  121. "a",
  122. m1,
  123. Column("id", Integer, primary_key=True),
  124. Column("x", Integer, autoincrement=False),
  125. )
  126. Table(
  127. "a",
  128. m2,
  129. Column("id", Integer, primary_key=True),
  130. Column("x", BigInteger, autoincrement=False),
  131. )
  132. ops = self._fixture(m1, m2, return_ops=True)
  133. is_(ops.ops[0].ops[0].kw["autoincrement"], False)
  134. def test_alter_column_autoincrement_nonpk_implicit_false(self):
  135. m1 = MetaData()
  136. m2 = MetaData()
  137. Table(
  138. "a",
  139. m1,
  140. Column("id", Integer, primary_key=True),
  141. Column("x", Integer),
  142. )
  143. Table(
  144. "a",
  145. m2,
  146. Column("id", Integer, primary_key=True),
  147. Column("x", BigInteger),
  148. )
  149. ops = self._fixture(m1, m2, return_ops=True)
  150. assert "autoincrement" not in ops.ops[0].ops[0].kw
  151. def test_alter_column_autoincrement_nonpk_explicit_true(self):
  152. m1 = MetaData()
  153. m2 = MetaData()
  154. Table(
  155. "a",
  156. m1,
  157. Column("id", Integer, primary_key=True, autoincrement=False),
  158. Column("x", Integer, autoincrement=True),
  159. )
  160. Table(
  161. "a",
  162. m2,
  163. Column("id", Integer, primary_key=True, autoincrement=False),
  164. Column("x", BigInteger, autoincrement=True),
  165. )
  166. ops = self._fixture(m1, m2, return_ops=True)
  167. is_(ops.ops[0].ops[0].kw["autoincrement"], True)
  168. def test_alter_column_autoincrement_compositepk_false(self):
  169. m1 = MetaData()
  170. m2 = MetaData()
  171. Table(
  172. "a",
  173. m1,
  174. Column("id", Integer, primary_key=True),
  175. Column("x", Integer, primary_key=True, autoincrement=False),
  176. )
  177. Table(
  178. "a",
  179. m2,
  180. Column("id", Integer, primary_key=True),
  181. Column("x", BigInteger, primary_key=True, autoincrement=False),
  182. )
  183. ops = self._fixture(m1, m2, return_ops=True)
  184. is_(ops.ops[0].ops[0].kw["autoincrement"], False)
  185. def test_alter_column_autoincrement_compositepk_implicit_false(self):
  186. m1 = MetaData()
  187. m2 = MetaData()
  188. Table(
  189. "a",
  190. m1,
  191. Column("id", Integer, primary_key=True),
  192. Column("x", Integer, primary_key=True),
  193. )
  194. Table(
  195. "a",
  196. m2,
  197. Column("id", Integer, primary_key=True),
  198. Column("x", BigInteger, primary_key=True),
  199. )
  200. ops = self._fixture(m1, m2, return_ops=True)
  201. assert "autoincrement" not in ops.ops[0].ops[0].kw
  202. @config.requirements.autoincrement_on_composite_pk
  203. def test_alter_column_autoincrement_compositepk_explicit_true(self):
  204. m1 = MetaData()
  205. m2 = MetaData()
  206. Table(
  207. "a",
  208. m1,
  209. Column("id", Integer, primary_key=True, autoincrement=False),
  210. Column("x", Integer, primary_key=True, autoincrement=True),
  211. # on SQLA 1.0 and earlier, this being present
  212. # trips the "add KEY for the primary key" so that the
  213. # AUTO_INCREMENT keyword is accepted by MySQL. SQLA 1.1 and
  214. # greater the columns are just reorganized.
  215. mysql_engine="InnoDB",
  216. )
  217. Table(
  218. "a",
  219. m2,
  220. Column("id", Integer, primary_key=True, autoincrement=False),
  221. Column("x", BigInteger, primary_key=True, autoincrement=True),
  222. )
  223. ops = self._fixture(m1, m2, return_ops=True)
  224. is_(ops.ops[0].ops[0].kw["autoincrement"], True)