| 12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576777879808182838485868788899091929394959697989910010110210310410510610710810911011111211311411511611711811912012112212312412512612712812913013113213313413513613713813914014114214314414514614714814915015115215315415515615715815916016116216316416516616716816917017117217317417517617717817918018118218318418518618718818919019119219319419519619719819920020120220320420520620720820921021121221321421521621721821922022122222322422522622722822923023123223323423523623723823924024124224324424524624724824925025125225325425525625725825926026126226326426526626726826927027127227327427527627727827928028128228328428528628728828929029129229329429529629729829930030130230330430530630730830931031131231331431531631731831932032132232332432532632732832933033133233333433533633733833934034134234334434534634734834935035135235335435535635735835936036136236336436536636736836937037137237337437537637737837938038138238338438538638738838939039139239339439539639739839940040140240340440540640740840941041141241341441541641741841942042142242342442542642742842943043143243343443543643743843944044144244344444544644744844945045145245345445545645745845946046146246346446546646746846947047147247347447547647747847948048148248348448548648748848949049149249349449549649749849950050150250350450550650750850951051151251351451551651751851952052152252352452552652752852953053153253353453553653753853954054154254354454554654754854955055155255355455555655755855956056156256356456556656756856957057157257357457557657757857958058158258358458558658758858959059159259359459559659759859960060160260360460560660760860961061161261361461561661761861962062162262362462562662762862963063163263363463563663763863964064164264364464564664764864965065165265365465565665765865966066166266366466566666766866967067167267367467567667767867968068168268368468568668768868969069169269369469569669769869970070170270370470570670770870971071171271371471571671771871972072172272372472572672772872973073173273373473573673773873974074174274374474574674774874975075175275375475575675775875976076176276376476576676776876977077177277377477577677777877978078178278378478578678778878979079179279379479579679779879980080180280380480580680780880981081181281381481581681781881982082182282382482582682782882983083183283383483583683783883984084184284384484584684784884985085185285385485585685785885986086186286386486586686786886987087187287387487587687787887988088188288388488588688788888989089189289389489589689789889990090190290390490590690790890991091191291391491591691791891992092192292392492592692792892993093193293393493593693793893994094194294394494594694794894995095195295395495595695795895996096196296396496596696796896997097197297397497597697797897998098198298398498598698798898999099199299399499599699799899910001001100210031004100510061007100810091010101110121013101410151016101710181019102010211022102310241025102610271028102910301031103210331034103510361037103810391040104110421043104410451046104710481049105010511052105310541055105610571058105910601061106210631064106510661067106810691070107110721073107410751076107710781079108010811082108310841085108610871088108910901091109210931094109510961097109810991100110111021103110411051106110711081109111011111112111311141115111611171118111911201121112211231124112511261127112811291130113111321133113411351136113711381139114011411142114311441145114611471148114911501151115211531154115511561157115811591160116111621163116411651166116711681169117011711172117311741175117611771178117911801181118211831184118511861187118811891190 |
- from sqlalchemy import Column
- from sqlalchemy import ForeignKeyConstraint
- from sqlalchemy import Integer
- from sqlalchemy import MetaData
- from sqlalchemy import String
- from sqlalchemy import Table
- from ._autogen_fixtures import AutogenFixtureTest
- from ...testing import combinations
- from ...testing import config
- from ...testing import eq_
- from ...testing import mock
- from ...testing import TestBase
- class AutogenerateForeignKeysTest(AutogenFixtureTest, TestBase):
- __backend__ = True
- __requires__ = ("foreign_key_constraint_reflection",)
- def test_remove_fk(self):
- m1 = MetaData()
- m2 = MetaData()
- Table(
- "some_table",
- m1,
- Column("test", String(10), primary_key=True),
- )
- Table(
- "user",
- m1,
- Column("id", Integer, primary_key=True),
- Column("name", String(50), nullable=False),
- Column("a1", String(10), server_default="x"),
- Column("test2", String(10)),
- ForeignKeyConstraint(["test2"], ["some_table.test"]),
- )
- Table(
- "some_table",
- m2,
- Column("test", String(10), primary_key=True),
- )
- Table(
- "user",
- m2,
- Column("id", Integer, primary_key=True),
- Column("name", String(50), nullable=False),
- Column("a1", String(10), server_default="x"),
- Column("test2", String(10)),
- )
- diffs = self._fixture(m1, m2)
- self._assert_fk_diff(
- diffs[0],
- "remove_fk",
- "user",
- ["test2"],
- "some_table",
- ["test"],
- conditional_name="servergenerated",
- )
- def test_add_fk(self):
- m1 = MetaData()
- m2 = MetaData()
- Table(
- "some_table",
- m1,
- Column("id", Integer, primary_key=True),
- Column("test", String(10)),
- )
- Table(
- "user",
- m1,
- Column("id", Integer, primary_key=True),
- Column("name", String(50), nullable=False),
- Column("a1", String(10), server_default="x"),
- Column("test2", String(10)),
- )
- Table(
- "some_table",
- m2,
- Column("id", Integer, primary_key=True),
- Column("test", String(10)),
- )
- Table(
- "user",
- m2,
- Column("id", Integer, primary_key=True),
- Column("name", String(50), nullable=False),
- Column("a1", String(10), server_default="x"),
- Column("test2", String(10)),
- ForeignKeyConstraint(["test2"], ["some_table.test"]),
- )
- diffs = self._fixture(m1, m2)
- self._assert_fk_diff(
- diffs[0], "add_fk", "user", ["test2"], "some_table", ["test"]
- )
- def test_no_change(self):
- m1 = MetaData()
- m2 = MetaData()
- Table(
- "some_table",
- m1,
- Column("id", Integer, primary_key=True),
- Column("test", String(10)),
- )
- Table(
- "user",
- m1,
- Column("id", Integer, primary_key=True),
- Column("name", String(50), nullable=False),
- Column("a1", String(10), server_default="x"),
- Column("test2", Integer),
- ForeignKeyConstraint(["test2"], ["some_table.id"]),
- )
- Table(
- "some_table",
- m2,
- Column("id", Integer, primary_key=True),
- Column("test", String(10)),
- )
- Table(
- "user",
- m2,
- Column("id", Integer, primary_key=True),
- Column("name", String(50), nullable=False),
- Column("a1", String(10), server_default="x"),
- Column("test2", Integer),
- ForeignKeyConstraint(["test2"], ["some_table.id"]),
- )
- diffs = self._fixture(m1, m2)
- eq_(diffs, [])
- def test_no_change_composite_fk(self):
- m1 = MetaData()
- m2 = MetaData()
- Table(
- "some_table",
- m1,
- Column("id_1", String(10), primary_key=True),
- Column("id_2", String(10), primary_key=True),
- )
- Table(
- "user",
- m1,
- Column("id", Integer, primary_key=True),
- Column("name", String(50), nullable=False),
- Column("a1", String(10), server_default="x"),
- Column("other_id_1", String(10)),
- Column("other_id_2", String(10)),
- ForeignKeyConstraint(
- ["other_id_1", "other_id_2"],
- ["some_table.id_1", "some_table.id_2"],
- ),
- )
- Table(
- "some_table",
- m2,
- Column("id_1", String(10), primary_key=True),
- Column("id_2", String(10), primary_key=True),
- )
- Table(
- "user",
- m2,
- Column("id", Integer, primary_key=True),
- Column("name", String(50), nullable=False),
- Column("a1", String(10), server_default="x"),
- Column("other_id_1", String(10)),
- Column("other_id_2", String(10)),
- ForeignKeyConstraint(
- ["other_id_1", "other_id_2"],
- ["some_table.id_1", "some_table.id_2"],
- ),
- )
- diffs = self._fixture(m1, m2)
- eq_(diffs, [])
- def test_casing_convention_changed_so_put_drops_first(self):
- m1 = MetaData()
- m2 = MetaData()
- Table(
- "some_table",
- m1,
- Column("test", String(10), primary_key=True),
- )
- Table(
- "user",
- m1,
- Column("id", Integer, primary_key=True),
- Column("name", String(50), nullable=False),
- Column("a1", String(10), server_default="x"),
- Column("test2", String(10)),
- ForeignKeyConstraint(["test2"], ["some_table.test"], name="MyFK"),
- )
- Table(
- "some_table",
- m2,
- Column("test", String(10), primary_key=True),
- )
- # foreign key autogen currently does not take "name" into account,
- # so change the def just for the purposes of testing the
- # add/drop order for now.
- Table(
- "user",
- m2,
- Column("id", Integer, primary_key=True),
- Column("name", String(50), nullable=False),
- Column("a1", String(10), server_default="x"),
- Column("test2", String(10)),
- ForeignKeyConstraint(["a1"], ["some_table.test"], name="myfk"),
- )
- diffs = self._fixture(m1, m2)
- self._assert_fk_diff(
- diffs[0],
- "remove_fk",
- "user",
- ["test2"],
- "some_table",
- ["test"],
- name="MyFK" if config.requirements.fk_names.enabled else None,
- )
- self._assert_fk_diff(
- diffs[1],
- "add_fk",
- "user",
- ["a1"],
- "some_table",
- ["test"],
- name="myfk",
- )
- def test_add_composite_fk_with_name(self):
- m1 = MetaData()
- m2 = MetaData()
- Table(
- "some_table",
- m1,
- Column("id_1", String(10), primary_key=True),
- Column("id_2", String(10), primary_key=True),
- )
- Table(
- "user",
- m1,
- Column("id", Integer, primary_key=True),
- Column("name", String(50), nullable=False),
- Column("a1", String(10), server_default="x"),
- Column("other_id_1", String(10)),
- Column("other_id_2", String(10)),
- )
- Table(
- "some_table",
- m2,
- Column("id_1", String(10), primary_key=True),
- Column("id_2", String(10), primary_key=True),
- )
- Table(
- "user",
- m2,
- Column("id", Integer, primary_key=True),
- Column("name", String(50), nullable=False),
- Column("a1", String(10), server_default="x"),
- Column("other_id_1", String(10)),
- Column("other_id_2", String(10)),
- ForeignKeyConstraint(
- ["other_id_1", "other_id_2"],
- ["some_table.id_1", "some_table.id_2"],
- name="fk_test_name",
- ),
- )
- diffs = self._fixture(m1, m2)
- self._assert_fk_diff(
- diffs[0],
- "add_fk",
- "user",
- ["other_id_1", "other_id_2"],
- "some_table",
- ["id_1", "id_2"],
- name="fk_test_name",
- )
- @config.requirements.no_name_normalize
- def test_remove_composite_fk(self):
- m1 = MetaData()
- m2 = MetaData()
- Table(
- "some_table",
- m1,
- Column("id_1", String(10), primary_key=True),
- Column("id_2", String(10), primary_key=True),
- )
- Table(
- "user",
- m1,
- Column("id", Integer, primary_key=True),
- Column("name", String(50), nullable=False),
- Column("a1", String(10), server_default="x"),
- Column("other_id_1", String(10)),
- Column("other_id_2", String(10)),
- ForeignKeyConstraint(
- ["other_id_1", "other_id_2"],
- ["some_table.id_1", "some_table.id_2"],
- name="fk_test_name",
- ),
- )
- Table(
- "some_table",
- m2,
- Column("id_1", String(10), primary_key=True),
- Column("id_2", String(10), primary_key=True),
- )
- Table(
- "user",
- m2,
- Column("id", Integer, primary_key=True),
- Column("name", String(50), nullable=False),
- Column("a1", String(10), server_default="x"),
- Column("other_id_1", String(10)),
- Column("other_id_2", String(10)),
- )
- diffs = self._fixture(m1, m2)
- self._assert_fk_diff(
- diffs[0],
- "remove_fk",
- "user",
- ["other_id_1", "other_id_2"],
- "some_table",
- ["id_1", "id_2"],
- conditional_name="fk_test_name",
- )
- def test_add_fk_colkeys(self):
- m1 = MetaData()
- m2 = MetaData()
- Table(
- "some_table",
- m1,
- Column("id_1", String(10), primary_key=True),
- Column("id_2", String(10), primary_key=True),
- )
- Table(
- "user",
- m1,
- Column("id", Integer, primary_key=True),
- Column("other_id_1", String(10)),
- Column("other_id_2", String(10)),
- )
- Table(
- "some_table",
- m2,
- Column("id_1", String(10), key="tid1", primary_key=True),
- Column("id_2", String(10), key="tid2", primary_key=True),
- )
- Table(
- "user",
- m2,
- Column("id", Integer, primary_key=True),
- Column("other_id_1", String(10), key="oid1"),
- Column("other_id_2", String(10), key="oid2"),
- ForeignKeyConstraint(
- ["oid1", "oid2"],
- ["some_table.tid1", "some_table.tid2"],
- name="fk_test_name",
- ),
- )
- diffs = self._fixture(m1, m2)
- self._assert_fk_diff(
- diffs[0],
- "add_fk",
- "user",
- ["other_id_1", "other_id_2"],
- "some_table",
- ["id_1", "id_2"],
- name="fk_test_name",
- )
- def test_no_change_colkeys(self):
- m1 = MetaData()
- m2 = MetaData()
- Table(
- "some_table",
- m1,
- Column("id_1", String(10), primary_key=True),
- Column("id_2", String(10), primary_key=True),
- )
- Table(
- "user",
- m1,
- Column("id", Integer, primary_key=True),
- Column("other_id_1", String(10)),
- Column("other_id_2", String(10)),
- ForeignKeyConstraint(
- ["other_id_1", "other_id_2"],
- ["some_table.id_1", "some_table.id_2"],
- ),
- )
- Table(
- "some_table",
- m2,
- Column("id_1", String(10), key="tid1", primary_key=True),
- Column("id_2", String(10), key="tid2", primary_key=True),
- )
- Table(
- "user",
- m2,
- Column("id", Integer, primary_key=True),
- Column("other_id_1", String(10), key="oid1"),
- Column("other_id_2", String(10), key="oid2"),
- ForeignKeyConstraint(
- ["oid1", "oid2"], ["some_table.tid1", "some_table.tid2"]
- ),
- )
- diffs = self._fixture(m1, m2)
- eq_(diffs, [])
- class IncludeHooksTest(AutogenFixtureTest, TestBase):
- __backend__ = True
- __requires__ = ("fk_names",)
- @combinations(("object",), ("name",))
- @config.requirements.no_name_normalize
- def test_remove_connection_fk(self, hook_type):
- m1 = MetaData()
- m2 = MetaData()
- ref = Table(
- "ref",
- m1,
- Column("id", Integer, primary_key=True),
- )
- t1 = Table(
- "t",
- m1,
- Column("x", Integer),
- Column("y", Integer),
- )
- t1.append_constraint(
- ForeignKeyConstraint([t1.c.x], [ref.c.id], name="fk1")
- )
- t1.append_constraint(
- ForeignKeyConstraint([t1.c.y], [ref.c.id], name="fk2")
- )
- ref = Table(
- "ref",
- m2,
- Column("id", Integer, primary_key=True),
- )
- Table(
- "t",
- m2,
- Column("x", Integer),
- Column("y", Integer),
- )
- if hook_type == "object":
- def include_object(object_, name, type_, reflected, compare_to):
- return not (
- isinstance(object_, ForeignKeyConstraint)
- and type_ == "foreign_key_constraint"
- and reflected
- and name == "fk1"
- )
- diffs = self._fixture(m1, m2, object_filters=include_object)
- elif hook_type == "name":
- def include_name(name, type_, parent_names):
- if name == "fk1":
- if type_ == "index": # MariaDB thing
- return True
- eq_(type_, "foreign_key_constraint")
- eq_(
- parent_names,
- {
- "schema_name": None,
- "table_name": "t",
- "schema_qualified_table_name": "t",
- },
- )
- return False
- else:
- return True
- diffs = self._fixture(m1, m2, name_filters=include_name)
- self._assert_fk_diff(
- diffs[0],
- "remove_fk",
- "t",
- ["y"],
- "ref",
- ["id"],
- conditional_name="fk2",
- )
- eq_(len(diffs), 1)
- def test_add_metadata_fk(self):
- m1 = MetaData()
- m2 = MetaData()
- Table(
- "ref",
- m1,
- Column("id", Integer, primary_key=True),
- )
- Table(
- "t",
- m1,
- Column("x", Integer),
- Column("y", Integer),
- )
- ref = Table(
- "ref",
- m2,
- Column("id", Integer, primary_key=True),
- )
- t2 = Table(
- "t",
- m2,
- Column("x", Integer),
- Column("y", Integer),
- )
- t2.append_constraint(
- ForeignKeyConstraint([t2.c.x], [ref.c.id], name="fk1")
- )
- t2.append_constraint(
- ForeignKeyConstraint([t2.c.y], [ref.c.id], name="fk2")
- )
- def include_object(object_, name, type_, reflected, compare_to):
- return not (
- isinstance(object_, ForeignKeyConstraint)
- and type_ == "foreign_key_constraint"
- and not reflected
- and name == "fk1"
- )
- diffs = self._fixture(m1, m2, object_filters=include_object)
- self._assert_fk_diff(
- diffs[0], "add_fk", "t", ["y"], "ref", ["id"], name="fk2"
- )
- eq_(len(diffs), 1)
- @combinations(("object",), ("name",))
- @config.requirements.no_name_normalize
- def test_change_fk(self, hook_type):
- m1 = MetaData()
- m2 = MetaData()
- r1a = Table(
- "ref_a",
- m1,
- Column("a", Integer, primary_key=True),
- )
- Table(
- "ref_b",
- m1,
- Column("a", Integer, primary_key=True),
- Column("b", Integer, primary_key=True),
- )
- t1 = Table(
- "t",
- m1,
- Column("x", Integer),
- Column("y", Integer),
- Column("z", Integer),
- )
- t1.append_constraint(
- ForeignKeyConstraint([t1.c.x], [r1a.c.a], name="fk1")
- )
- t1.append_constraint(
- ForeignKeyConstraint([t1.c.y], [r1a.c.a], name="fk2")
- )
- Table(
- "ref_a",
- m2,
- Column("a", Integer, primary_key=True),
- )
- r2b = Table(
- "ref_b",
- m2,
- Column("a", Integer, primary_key=True),
- Column("b", Integer, primary_key=True),
- )
- t2 = Table(
- "t",
- m2,
- Column("x", Integer),
- Column("y", Integer),
- Column("z", Integer),
- )
- t2.append_constraint(
- ForeignKeyConstraint(
- [t2.c.x, t2.c.z], [r2b.c.a, r2b.c.b], name="fk1"
- )
- )
- t2.append_constraint(
- ForeignKeyConstraint(
- [t2.c.y, t2.c.z], [r2b.c.a, r2b.c.b], name="fk2"
- )
- )
- if hook_type == "object":
- def include_object(object_, name, type_, reflected, compare_to):
- return not (
- isinstance(object_, ForeignKeyConstraint)
- and type_ == "foreign_key_constraint"
- and name == "fk1"
- )
- diffs = self._fixture(m1, m2, object_filters=include_object)
- elif hook_type == "name":
- def include_name(name, type_, parent_names):
- if type_ == "index":
- return True # MariaDB thing
- if name == "fk1":
- eq_(type_, "foreign_key_constraint")
- eq_(
- parent_names,
- {
- "schema_name": None,
- "table_name": "t",
- "schema_qualified_table_name": "t",
- },
- )
- return False
- else:
- return True
- diffs = self._fixture(m1, m2, name_filters=include_name)
- if hook_type == "object":
- self._assert_fk_diff(
- diffs[0], "remove_fk", "t", ["y"], "ref_a", ["a"], name="fk2"
- )
- self._assert_fk_diff(
- diffs[1],
- "add_fk",
- "t",
- ["y", "z"],
- "ref_b",
- ["a", "b"],
- name="fk2",
- )
- eq_(len(diffs), 2)
- elif hook_type == "name":
- eq_(
- {(d[0], d[1].name) for d in diffs},
- {("add_fk", "fk2"), ("add_fk", "fk1"), ("remove_fk", "fk2")},
- )
- class AutogenerateFKOptionsTest(AutogenFixtureTest, TestBase):
- __backend__ = True
- def _fk_opts_fixture(self, old_opts, new_opts):
- m1 = MetaData()
- m2 = MetaData()
- Table(
- "some_table",
- m1,
- Column("id", Integer, primary_key=True),
- Column("test", String(10)),
- )
- Table(
- "user",
- m1,
- Column("id", Integer, primary_key=True),
- Column("name", String(50), nullable=False),
- Column("tid", Integer),
- ForeignKeyConstraint(["tid"], ["some_table.id"], **old_opts),
- )
- Table(
- "some_table",
- m2,
- Column("id", Integer, primary_key=True),
- Column("test", String(10)),
- )
- Table(
- "user",
- m2,
- Column("id", Integer, primary_key=True),
- Column("name", String(50), nullable=False),
- Column("tid", Integer),
- ForeignKeyConstraint(["tid"], ["some_table.id"], **new_opts),
- )
- return self._fixture(m1, m2)
- @config.requirements.fk_ondelete_is_reflected
- def test_add_ondelete(self):
- diffs = self._fk_opts_fixture({}, {"ondelete": "cascade"})
- self._assert_fk_diff(
- diffs[0],
- "remove_fk",
- "user",
- ["tid"],
- "some_table",
- ["id"],
- ondelete=None,
- conditional_name="servergenerated",
- )
- self._assert_fk_diff(
- diffs[1],
- "add_fk",
- "user",
- ["tid"],
- "some_table",
- ["id"],
- ondelete="cascade",
- )
- @config.requirements.fk_ondelete_is_reflected
- def test_remove_ondelete(self):
- diffs = self._fk_opts_fixture({"ondelete": "CASCADE"}, {})
- self._assert_fk_diff(
- diffs[0],
- "remove_fk",
- "user",
- ["tid"],
- "some_table",
- ["id"],
- ondelete="CASCADE",
- conditional_name="servergenerated",
- )
- self._assert_fk_diff(
- diffs[1],
- "add_fk",
- "user",
- ["tid"],
- "some_table",
- ["id"],
- ondelete=None,
- )
- def test_nochange_ondelete(self):
- """test case sensitivity"""
- diffs = self._fk_opts_fixture(
- {"ondelete": "caSCAde"}, {"ondelete": "CasCade"}
- )
- eq_(diffs, [])
- @config.requirements.fk_onupdate_is_reflected
- def test_add_onupdate(self):
- diffs = self._fk_opts_fixture({}, {"onupdate": "cascade"})
- self._assert_fk_diff(
- diffs[0],
- "remove_fk",
- "user",
- ["tid"],
- "some_table",
- ["id"],
- onupdate=None,
- conditional_name="servergenerated",
- )
- self._assert_fk_diff(
- diffs[1],
- "add_fk",
- "user",
- ["tid"],
- "some_table",
- ["id"],
- onupdate="cascade",
- )
- @config.requirements.fk_onupdate_is_reflected
- def test_remove_onupdate(self):
- diffs = self._fk_opts_fixture({"onupdate": "CASCADE"}, {})
- self._assert_fk_diff(
- diffs[0],
- "remove_fk",
- "user",
- ["tid"],
- "some_table",
- ["id"],
- onupdate="CASCADE",
- conditional_name="servergenerated",
- )
- self._assert_fk_diff(
- diffs[1],
- "add_fk",
- "user",
- ["tid"],
- "some_table",
- ["id"],
- onupdate=None,
- )
- @config.requirements.fk_onupdate
- def test_nochange_onupdate(self):
- """test case sensitivity"""
- diffs = self._fk_opts_fixture(
- {"onupdate": "caSCAde"}, {"onupdate": "CasCade"}
- )
- eq_(diffs, [])
- @config.requirements.fk_ondelete_restrict
- def test_nochange_ondelete_restrict(self):
- """test the RESTRICT option which MySQL doesn't report on"""
- diffs = self._fk_opts_fixture(
- {"ondelete": "restrict"}, {"ondelete": "restrict"}
- )
- eq_(diffs, [])
- @config.requirements.fk_onupdate_restrict
- def test_nochange_onupdate_restrict(self):
- """test the RESTRICT option which MySQL doesn't report on"""
- diffs = self._fk_opts_fixture(
- {"onupdate": "restrict"}, {"onupdate": "restrict"}
- )
- eq_(diffs, [])
- @config.requirements.fk_ondelete_noaction
- def test_nochange_ondelete_noaction(self):
- """test the NO ACTION option which generally comes back as None"""
- diffs = self._fk_opts_fixture(
- {"ondelete": "no action"}, {"ondelete": "no action"}
- )
- eq_(diffs, [])
- @config.requirements.fk_onupdate
- def test_nochange_onupdate_noaction(self):
- """test the NO ACTION option which generally comes back as None"""
- diffs = self._fk_opts_fixture(
- {"onupdate": "no action"}, {"onupdate": "no action"}
- )
- eq_(diffs, [])
- @config.requirements.fk_ondelete_restrict
- def test_change_ondelete_from_restrict(self):
- """test the RESTRICT option which MySQL doesn't report on"""
- # note that this is impossible to detect if we change
- # from RESTRICT to NO ACTION on MySQL.
- diffs = self._fk_opts_fixture(
- {"ondelete": "restrict"}, {"ondelete": "cascade"}
- )
- self._assert_fk_diff(
- diffs[0],
- "remove_fk",
- "user",
- ["tid"],
- "some_table",
- ["id"],
- onupdate=None,
- ondelete=mock.ANY, # MySQL reports None, PG reports RESTRICT
- conditional_name="servergenerated",
- )
- self._assert_fk_diff(
- diffs[1],
- "add_fk",
- "user",
- ["tid"],
- "some_table",
- ["id"],
- onupdate=None,
- ondelete="cascade",
- )
- @config.requirements.fk_ondelete_restrict
- def test_change_onupdate_from_restrict(self):
- """test the RESTRICT option which MySQL doesn't report on"""
- # note that this is impossible to detect if we change
- # from RESTRICT to NO ACTION on MySQL.
- diffs = self._fk_opts_fixture(
- {"onupdate": "restrict"}, {"onupdate": "cascade"}
- )
- self._assert_fk_diff(
- diffs[0],
- "remove_fk",
- "user",
- ["tid"],
- "some_table",
- ["id"],
- onupdate=mock.ANY, # MySQL reports None, PG reports RESTRICT
- ondelete=None,
- conditional_name="servergenerated",
- )
- self._assert_fk_diff(
- diffs[1],
- "add_fk",
- "user",
- ["tid"],
- "some_table",
- ["id"],
- onupdate="cascade",
- ondelete=None,
- )
- @config.requirements.fk_ondelete_is_reflected
- @config.requirements.fk_onupdate_is_reflected
- def test_ondelete_onupdate_combo(self):
- diffs = self._fk_opts_fixture(
- {"onupdate": "CASCADE", "ondelete": "SET NULL"},
- {"onupdate": "RESTRICT", "ondelete": "RESTRICT"},
- )
- self._assert_fk_diff(
- diffs[0],
- "remove_fk",
- "user",
- ["tid"],
- "some_table",
- ["id"],
- onupdate="CASCADE",
- ondelete="SET NULL",
- conditional_name="servergenerated",
- )
- self._assert_fk_diff(
- diffs[1],
- "add_fk",
- "user",
- ["tid"],
- "some_table",
- ["id"],
- onupdate="RESTRICT",
- ondelete="RESTRICT",
- )
- @config.requirements.fk_initially
- def test_add_initially_deferred(self):
- diffs = self._fk_opts_fixture({}, {"initially": "deferred"})
- self._assert_fk_diff(
- diffs[0],
- "remove_fk",
- "user",
- ["tid"],
- "some_table",
- ["id"],
- initially=None,
- conditional_name="servergenerated",
- )
- self._assert_fk_diff(
- diffs[1],
- "add_fk",
- "user",
- ["tid"],
- "some_table",
- ["id"],
- initially="deferred",
- )
- @config.requirements.fk_initially
- def test_remove_initially_deferred(self):
- diffs = self._fk_opts_fixture({"initially": "deferred"}, {})
- self._assert_fk_diff(
- diffs[0],
- "remove_fk",
- "user",
- ["tid"],
- "some_table",
- ["id"],
- initially="DEFERRED",
- deferrable=True,
- conditional_name="servergenerated",
- )
- self._assert_fk_diff(
- diffs[1],
- "add_fk",
- "user",
- ["tid"],
- "some_table",
- ["id"],
- initially=None,
- )
- @config.requirements.fk_deferrable
- @config.requirements.fk_initially
- def test_add_initially_immediate_plus_deferrable(self):
- diffs = self._fk_opts_fixture(
- {}, {"initially": "immediate", "deferrable": True}
- )
- self._assert_fk_diff(
- diffs[0],
- "remove_fk",
- "user",
- ["tid"],
- "some_table",
- ["id"],
- initially=None,
- conditional_name="servergenerated",
- )
- self._assert_fk_diff(
- diffs[1],
- "add_fk",
- "user",
- ["tid"],
- "some_table",
- ["id"],
- initially="immediate",
- deferrable=True,
- )
- @config.requirements.fk_deferrable
- @config.requirements.fk_initially
- def test_remove_initially_immediate_plus_deferrable(self):
- diffs = self._fk_opts_fixture(
- {"initially": "immediate", "deferrable": True}, {}
- )
- self._assert_fk_diff(
- diffs[0],
- "remove_fk",
- "user",
- ["tid"],
- "some_table",
- ["id"],
- initially=None, # immediate is the default
- deferrable=True,
- conditional_name="servergenerated",
- )
- self._assert_fk_diff(
- diffs[1],
- "add_fk",
- "user",
- ["tid"],
- "some_table",
- ["id"],
- initially=None,
- deferrable=None,
- )
- @config.requirements.fk_initially
- @config.requirements.fk_deferrable
- def test_add_initially_deferrable_nochange_one(self):
- diffs = self._fk_opts_fixture(
- {"deferrable": True, "initially": "immediate"},
- {"deferrable": True, "initially": "immediate"},
- )
- eq_(diffs, [])
- @config.requirements.fk_initially
- @config.requirements.fk_deferrable
- def test_add_initially_deferrable_nochange_two(self):
- diffs = self._fk_opts_fixture(
- {"deferrable": True, "initially": "deferred"},
- {"deferrable": True, "initially": "deferred"},
- )
- eq_(diffs, [])
- @config.requirements.fk_initially
- @config.requirements.fk_deferrable
- def test_add_initially_deferrable_nochange_three(self):
- diffs = self._fk_opts_fixture(
- {"deferrable": None, "initially": "deferred"},
- {"deferrable": None, "initially": "deferred"},
- )
- eq_(diffs, [])
- @config.requirements.fk_deferrable
- def test_add_deferrable(self):
- diffs = self._fk_opts_fixture({}, {"deferrable": True})
- self._assert_fk_diff(
- diffs[0],
- "remove_fk",
- "user",
- ["tid"],
- "some_table",
- ["id"],
- deferrable=None,
- conditional_name="servergenerated",
- )
- self._assert_fk_diff(
- diffs[1],
- "add_fk",
- "user",
- ["tid"],
- "some_table",
- ["id"],
- deferrable=True,
- )
- @config.requirements.fk_deferrable_is_reflected
- def test_remove_deferrable(self):
- diffs = self._fk_opts_fixture({"deferrable": True}, {})
- self._assert_fk_diff(
- diffs[0],
- "remove_fk",
- "user",
- ["tid"],
- "some_table",
- ["id"],
- deferrable=True,
- conditional_name="servergenerated",
- )
- self._assert_fk_diff(
- diffs[1],
- "add_fk",
- "user",
- ["tid"],
- "some_table",
- ["id"],
- deferrable=None,
- )
|