예제 #1
0
 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()
예제 #2
0
    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)
예제 #3
0
    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)
예제 #4
0
    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
예제 #6
0
    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)
예제 #7
0
    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)
예제 #8
0
    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)
예제 #9
0
    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)
예제 #10
0
 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,
     )
예제 #11
0
    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)
예제 #12
0
 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()
예제 #13
0
    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)