def test_create_table_error_on_table_with_index(self, get_model): get_model.return_value = None new_model = models.IndexTestModel test_update = update.CreateTable(new_model) with self.assertRaisesRegex( error.SpannerError, 'indexes cannot be created', ): test_update.validate()
def test_create_table_interleaved_parent(self, get_model): get_model.return_value = None new_model = models.SmallTestParentModel test_update = update.CreateTable(new_model) test_update.validate() test_model_ddl = ("CREATE TABLE SmallTestParentModel (" "key STRING(MAX) NOT NULL, " "value_1 STRING(MAX) NOT NULL, " "value_2 STRING(MAX)) " "PRIMARY KEY (key)") self.assertEqual(test_update.ddl(), test_model_ddl)
def test_create_table(self, get_model): get_model.return_value = None new_model = models.UnittestModel test_update = update.CreateTable(new_model) test_update.validate() test_model_ddl = ( 'CREATE TABLE table (int_ INT64 NOT NULL, int_2 INT64,' ' string STRING(MAX) NOT NULL, string_2 STRING(MAX),' ' timestamp TIMESTAMP NOT NULL, string_array' ' ARRAY<STRING(MAX)>) PRIMARY KEY (int_, string)') self.assertEqual(test_update.ddl(), test_model_ddl)
def test_create_table_interleaved(self, get_model): get_model.return_value = None new_model = models.ChildTestModel test_update = update.CreateTable(new_model) test_update.validate() test_model_ddl = ( "CREATE TABLE ChildTestModel (" "key STRING(MAX) NOT NULL, " "child_key STRING(MAX) NOT NULL) " "PRIMARY KEY (key, child_key), " "INTERLEAVE IN PARENT SmallTestParentModel ON DELETE CASCADE") self.assertEqual(test_update.ddl(), test_model_ddl)
def _migration_status(self) -> Dict[str, bool]: """Gathers from Spanner which migrations have been executed.""" if self._migration_status_map is None: model_from_db = metadata.SpannerMetadata.model( migration_status.MigrationStatus.table) if not model_from_db: update.CreateTable(migration_status.MigrationStatus).execute() self._migration_status_map = { migration_.id: migration_.migrated for migration_ in migration_status.MigrationStatus.all() } return self._migration_status_map
def test_create_table_foreign_keys(self, get_model): get_model.return_value = None new_model = models.RelationshipTestModel test_update = update.CreateTable(new_model) test_update.validate() test_model_ddl = ( "CREATE TABLE RelationshipTestModel (" "parent_key STRING(MAX) NOT NULL, " "child_key STRING(MAX) NOT NULL, " "CONSTRAINT parent FOREIGN KEY (parent_key) REFERENCES spanner_orm.tests.models.SmallTestModel (key), " "CONSTRAINT parents FOREIGN KEY (parent_key) REFERENCES spanner_orm.tests.models.SmallTestModel (key), " "CONSTRAINT fk_multicolumn FOREIGN KEY (parent_key, parent_key2) REFERENCES spanner_orm.tests.models.SmallTestModel (key, key2)) " "PRIMARY KEY (parent_key, child_key)") self.assertEqual(test_update.ddl(), test_model_ddl)
def test_create_table_foreign_keys_no_model(self, get_model): get_model.return_value = None test_update = update.CreateTable( table_name="RelationshipTestModel", primary_keys=["parent_key", "child_key"], fields={ "parent_key": field.Field(field.String, primary_key=True, name="parent_key"), "child_key": field.Field(field.String, primary_key=True, name="child_key"), }, relations={ "parent": relationship.Relationship( "spanner_orm.tests.models.SmallTestModel", {"parent_key": "key"}, single=True, ), "parents": relationship.Relationship( "spanner_orm.tests.models.SmallTestModel", {"parent_key": "key"}), "fk_multicolumn": relationship.Relationship( "spanner_orm.tests.models.SmallTestModel", { "parent_key": "key", "parent_key2": "key2" }, ), }, ) test_update.validate() test_model_ddl = ( "CREATE TABLE RelationshipTestModel (" "parent_key STRING(MAX) NOT NULL, " "child_key STRING(MAX) NOT NULL, " "CONSTRAINT parent FOREIGN KEY (parent_key) REFERENCES spanner_orm.tests.models.SmallTestModel (key), " "CONSTRAINT parents FOREIGN KEY (parent_key) REFERENCES spanner_orm.tests.models.SmallTestModel (key), " "CONSTRAINT fk_multicolumn FOREIGN KEY (parent_key, parent_key2) REFERENCES spanner_orm.tests.models.SmallTestModel (key, key2)) " "PRIMARY KEY (parent_key, child_key)") self.assertEqual(test_update.ddl(), test_model_ddl)
def test_create_table_interleaved_no_model(self, get_model): get_model.return_value = None test_update = update.CreateTable( table_name="ChildTestModel", primary_keys=["key", "child_key"], fields={ "key": field.Field(field.String, primary_key=True, name="key"), "child_key": field.Field(field.String, primary_key=True, name="child_key"), }, interleaved=models.SmallTestModel, ) test_update.validate() test_model_ddl = ( "CREATE TABLE ChildTestModel (" "key STRING(MAX) NOT NULL, " "child_key STRING(MAX) NOT NULL) " "PRIMARY KEY (key, child_key), " "INTERLEAVE IN PARENT SmallTestModel ON DELETE CASCADE") self.assertEqual(test_update.ddl(), test_model_ddl)
def test_create_table(self, get_model): get_model.return_value = None new_model = models.UnittestModel test_update = update.CreateTable(new_model) test_update.validate() test_model_ddl = ( "CREATE TABLE table (int_ INT64 NOT NULL, int_2 INT64," " float_ FLOAT64 NOT NULL, float_2 FLOAT64," " string STRING(MAX) NOT NULL, string_2 STRING(MAX)," " string_3 STRING(10)," " timestamp TIMESTAMP NOT NULL," " timestamp_2 TIMESTAMP OPTIONS (allow_commit_timestamp=true)," " date DATE," " bool_array ARRAY<BOOL>," " int_array ARRAY<INT64>," " float_array ARRAY<FLOAT64>," " date_array ARRAY<DATE>," " string_array ARRAY<STRING(MAX)>," " string_array_2 ARRAY<STRING(50)>) PRIMARY KEY (int_, float_, string)" ) self.assertEqual(test_update.ddl(), test_model_ddl)
def test_execute_partitioned_dml(self): update.CreateTable( models.SmallTestModelWithoutSecondaryIndexes).execute() test_model = models.SmallTestModel( dict( key='some-key', value_1='foo', value_2='bar', )) test_model.save() update.ExecutePartitionedDml( "UPDATE SmallTestModel SET value_2 = value_1 WHERE value_2 = 'bar'", ).execute() test_model.reload() self.assertEqual( models.SmallTestModel( dict( key='some-key', value_1='foo', value_2='foo', )), test_model, )
def test_create_table_foreign_key(self, get_model): self.maxDiff = 2000 get_model.return_value = None new_model = models.ForeignKeyTestModel test_update = update.CreateTable(new_model) test_update.validate() test_model_ddl = ( 'CREATE TABLE ForeignKeyTestModel (' 'referencing_key_1 STRING(MAX) NOT NULL, ' 'referencing_key_2 STRING(MAX) NOT NULL, ' 'referencing_key_3 INT64 NOT NULL, ' 'self_referencing_key STRING(MAX), ' 'CONSTRAINT foreign_key_1 FOREIGN KEY (referencing_key_1) ' 'REFERENCES SmallTestModel (key), ' 'CONSTRAINT foreign_key_2 ' 'FOREIGN KEY (referencing_key_2, referencing_key_3) ' 'REFERENCES table (string, int_), ' 'CONSTRAINT foreign_key_3 FOREIGN KEY (self_referencing_key) ' 'REFERENCES ForeignKeyTestModel (referencing_key_1)) ' 'PRIMARY KEY (referencing_key_1, referencing_key_2, referencing_key_3)' ) self.assertEqual(test_update.ddl(), test_model_ddl)
def test_create_table_error_on_existing_table(self, get_model): get_model.return_value = models.SmallTestModel new_model = models.SmallTestModel test_update = update.CreateTable(new_model) with self.assertRaisesRegex(error.SpannerError, "already exists"): test_update.validate()
def test_create_table_no_model(self, get_model): get_model.return_value = None test_update = update.CreateTable( table_name="table", primary_keys=["int_", "float_", "string"], fields={ "int_": field.Field(field.Integer, primary_key=True, name="int_"), "int_2": field.Field(field.Integer, nullable=True, name="int_2"), "float_": field.Field(field.Float, primary_key=True, name="float_"), "float_2": field.Field(field.Float, nullable=True, name="float_2"), "string": field.Field(field.String, primary_key=True, name="string"), "string_2": field.Field(field.String, nullable=True, name="string_2"), "string_3": field.Field(field.String, nullable=True, size=10, name="string_3"), "timestamp": field.Field(field.Timestamp, name="timestamp"), "timestamp_2": field.Field( field.Timestamp, nullable=True, allow_commit_timestamp=True, name="timestamp_2", ), "date": field.Field(field.Date, nullable=True, name="date"), "bool_array": field.Field(field.BoolArray, nullable=True, name="bool_array"), "int_array": field.Field(field.IntegerArray, nullable=True, name="int_array"), "float_array": field.Field(field.FloatArray, nullable=True, name="float_array"), "date_array": field.Field(field.DateArray, nullable=True, name="date_array"), "string_array": field.Field(field.StringArray, nullable=True, name="string_array"), "string_array_2": field.Field(field.StringArray, nullable=True, size=50, name="string_array_2"), }, ) test_update.validate() test_model_ddl = ( "CREATE TABLE table (int_ INT64 NOT NULL, int_2 INT64," " float_ FLOAT64 NOT NULL, float_2 FLOAT64," " string STRING(MAX) NOT NULL, string_2 STRING(MAX)," " string_3 STRING(10)," " timestamp TIMESTAMP NOT NULL," " timestamp_2 TIMESTAMP OPTIONS (allow_commit_timestamp=true)," " date DATE," " bool_array ARRAY<BOOL>," " int_array ARRAY<INT64>," " float_array ARRAY<FLOAT64>," " date_array ARRAY<DATE>," " string_array ARRAY<STRING(MAX)>," " string_array_2 ARRAY<STRING(50)>) PRIMARY KEY (int_, float_, string)" ) self.assertEqual(test_update.ddl(), test_model_ddl)