/** * Creates a new database in this instance. * * @param databaseId the id of the database which will be created. It must conform to the regular * expression [a-z][a-z0-9_\-]*[a-z0-9] and be between 2 and 30 characters in length * @param statements DDL statements to run while creating the database, for example {@code CREATE * TABLE MyTable ( ... )}. This should not include {@code CREATE DATABASE} statement. */ public OperationFuture<Database, CreateDatabaseMetadata> createDatabase( String databaseId, Iterable<String> statements) throws SpannerException { return dbClient.createDatabase(instanceId(), databaseId, statements); }
/** Example to update the database DDL. */ // [TARGET updateDatabaseDdl(String, String, Iterable, String)] // [VARIABLE my_instance_id] // [VARIABLE my_database_id] public void updateDatabaseDdl(String instanceId, String databaseId) { // [START updateDatabaseDdl] try { dbAdminClient .updateDatabaseDdl( instanceId, databaseId, Arrays.asList("ALTER TABLE Albums ADD COLUMN MarketingBudget INT64"), null) .get(); } catch (ExecutionException e) { throw (SpannerException) e.getCause(); } catch (InterruptedException e) { throw SpannerExceptionFactory.propagateInterrupt(e); } // [END updateDatabaseDdl] }
/** Example to drop a Cloud Spanner database. */ // [TARGET dropDatabase(String, String)] // [VARIABLE my_instance_id] // [VARIABLE my_database_id] public void dropDatabase(String instanceId, String databaseId) { // [START dropDatabase] dbAdminClient.dropDatabase(instanceId, databaseId); // [END dropDatabase] }
String statement1 = "CREATE TABLE T (\n" + " K STRING(MAX),\n" + ") PRIMARY KEY(K)"; OperationFuture<Database, CreateDatabaseMetadata> op = dbAdminClient.createDatabase(instanceId, dbId, ImmutableList.of(statement1)); Database db = op.get(); dbs.add(db); assertThat(db.getId().getDatabase()).isEqualTo(dbId); db = dbAdminClient.getDatabase(instanceId, dbId); assertThat(db.getId().getDatabase()).isEqualTo(dbId); for (Database dbInList : Iterators.toArray( dbAdminClient.listDatabases(instanceId).iterateAll().iterator(), Database.class)) { if (dbInList.getId().getDatabase().equals(dbId)) { foundDb = true; dbAdminClient.updateDatabaseDdl(instanceId, dbId, ImmutableList.of(statement2), null); op2.get(); List<String> statementsInDb = dbAdminClient.getDatabaseDdl(instanceId, dbId); assertThat(statementsInDb).containsExactly(statement1, statement2); dbAdminClient.dropDatabase(instanceId, dbId); dbs.clear(); expectedException.expect(isSpannerException(ErrorCode.NOT_FOUND)); db = dbAdminClient.getDatabase(testHelper.getInstanceId().getInstance(), dbId);
@Test public void updateDdlRetry() throws Exception { String dbId = testHelper.getUniqueDatabaseId(); String instanceId = testHelper.getInstanceId().getInstance(); String statement1 = "CREATE TABLE T (\n" + " K STRING(MAX),\n" + ") PRIMARY KEY(K)"; OperationFuture<Database, CreateDatabaseMetadata> op = dbAdminClient.createDatabase(instanceId, dbId, ImmutableList.of(statement1)); Database db = op.get(); dbs.add(db); String statement2 = "CREATE TABLE T2 (\n" + " K2 STRING(MAX),\n" + ") PRIMARY KEY(K2)"; OperationFuture<Void, UpdateDatabaseDdlMetadata> op1 = dbAdminClient.updateDatabaseDdl(instanceId, dbId, ImmutableList.of(statement2), "myop"); OperationFuture<Void, UpdateDatabaseDdlMetadata> op2 = dbAdminClient.updateDatabaseDdl(instanceId, dbId, ImmutableList.of(statement2), "myop"); op1.get(); op2.get(); assertThat(op1.getMetadata().get()).isEqualTo(op2.getMetadata().get()); }
@Before public void setUp() throws Exception { PipelineOptionsFactory.register(SpannerTestPipelineOptions.class); options = TestPipeline.testingPipelineOptions().as(SpannerTestPipelineOptions.class); project = options.as(GcpOptions.class).getProject(); spanner = SpannerOptions.newBuilder().setProjectId(project).build().getService(); databaseName = generateDatabaseName(); databaseAdminClient = spanner.getDatabaseAdminClient(); // Delete database if exists. databaseAdminClient.dropDatabase(options.getInstanceId(), databaseName); Operation<Database, CreateDatabaseMetadata> op = databaseAdminClient.createDatabase( options.getInstanceId(), databaseName, Collections.singleton( "CREATE TABLE " + options.getTable() + " (" + " Key INT64," + " Value STRING(MAX) NOT NULL," + ") PRIMARY KEY (Key)")); op.waitFor(); }
@Test public void listPagination() throws Exception { List<String> dbIds = ImmutableList.of( testHelper.getUniqueDatabaseId(), testHelper.getUniqueDatabaseId(), testHelper.getUniqueDatabaseId()); String instanceId = testHelper.getInstanceId().getInstance(); for (String dbId : dbIds) { dbs.add(dbAdminClient.createDatabase(instanceId, dbId, ImmutableList.<String>of()).get()); } Page<Database> page = dbAdminClient.listDatabases(instanceId, Options.pageSize(1)); List<String> dbIdsGot = new ArrayList<>(); while (page != null) { Database db = Iterables.getOnlyElement(page.getValues()); dbIdsGot.add(db.getId().getDatabase()); page = page.getNextPage(); } assertThat(dbIdsGot).containsAllIn(dbIds); } }
public Page<Database> listDatabases() { return dbClient.listDatabases(instanceId()); }
/** Example to getDatabase. */ // [TARGET getDatabase(String, String)] // [VARIABLE my_instance_id] // [VARIABLE my_database_id] public Database getDatabase(String instanceId, String databaseId) { // [START getDatabase] Database db = dbAdminClient.getDatabase(instanceId, databaseId); // [END getDatabase] return db; }
/** Example to get the schema of a Cloud Spanner database. */ // [TARGET getDatabaseDdl(String, String)] // [VARIABLE my_instance_id] // [VARIABLE my_database_id] public List<String> getDatabaseDdl(String instanceId, String databaseId) { // [START getDatabaseDdl] List<String> statementsInDb = dbAdminClient.getDatabaseDdl(instanceId, databaseId); // [END getDatabaseDdl] return statementsInDb; }
/** * Execute the given DDL strings in order and creates the database if it does not * exist. * @param ddlStrings the DDL strings * @param createDatabase if {@code true}, then the database is created at the same * time as the tables using the DDL strings. if {@code false}, then the database must * already exist. */ public void executeDdlStrings(Iterable<String> ddlStrings, boolean createDatabase) { try { if (createDatabase && !this.databaseExists()) { this.databaseAdminClient .createDatabase(getInstanceId(), getDatabase(), ddlStrings) .get(); } else { this.databaseAdminClient.updateDatabaseDdl(getInstanceId(), getDatabase(), ddlStrings, null).get(); } } catch (InterruptedException ex) { Thread.currentThread().interrupt(); throw new SpannerDataException("DDL execution was interrupted", ex); } catch (ExecutionException ex) { throw new SpannerDataException("DDL could not be executed", ex); } }
@Before public void setUp() throws Exception { PipelineOptionsFactory.register(SpannerTestPipelineOptions.class); options = TestPipeline.testingPipelineOptions().as(SpannerTestPipelineOptions.class); project = options.as(GcpOptions.class).getProject(); spanner = SpannerOptions.newBuilder().setProjectId(project).build().getService(); databaseName = generateDatabaseName(); databaseAdminClient = spanner.getDatabaseAdminClient(); // Delete database if exists. databaseAdminClient.dropDatabase(options.getInstanceId(), databaseName); Operation<Database, CreateDatabaseMetadata> op = databaseAdminClient.createDatabase( options.getInstanceId(), databaseName, Collections.singleton( "CREATE TABLE " + options.getTable() + " (" + " Key INT64," + " Value STRING(MAX)," + ") PRIMARY KEY (Key)")); op.waitFor(); makeTestData(); }
/** Example to get the list of Cloud Spanner database in the given instance. */ // [TARGET listDatabases(String, ListOption...)] // [VARIABLE my_instance_id] public List<Database> listDatabases(String instanceId) { // [START listDatabases] Page<Database> page = dbAdminClient.listDatabases(instanceId, Options.pageSize(1)); List<Database> dbs = new ArrayList<>(); while (page != null) { Database db = Iterables.getOnlyElement(page.getValues()); dbs.add(db); page = page.getNextPage(); } // [END listDatabases] return dbs; } }
public Database getDatabase(String databaseId) { return dbClient.getDatabase(instanceId(), databaseId); }
/** * Returns the schema of a Cloud Spanner database as a list of formatted DDL statements. This * method does not show pending schema updates. */ public Iterable<String> getDdl() throws SpannerException { return dbClient.getDatabaseDdl(instance(), database()); }
/** * Execute the given DDL strings in order and creates the database if it does not * exist. * @param ddlStrings the DDL strings * @param createDatabase if {@code true}, then the database is created at the same * time as the tables using the DDL strings. if {@code false}, then the database must * already exist. */ public void executeDdlStrings(Iterable<String> ddlStrings, boolean createDatabase) { try { if (createDatabase && !this.databaseExists()) { this.databaseAdminClient .createDatabase(getInstanceId(), getDatabase(), ddlStrings) .get(); } else { this.databaseAdminClient.updateDatabaseDdl(getInstanceId(), getDatabase(), ddlStrings, null).get(); } } catch (InterruptedException ex) { Thread.currentThread().interrupt(); throw new SpannerDataException("DDL execution was interrupted", ex); } catch (ExecutionException ex) { throw new SpannerDataException("DDL could not be executed", ex); } }
/** * Enqueues the given DDL statements to be applied, in order but not necessarily all at once, to * the database schema at some point (or points) in the future. The server checks that the * statements are executable (syntactically valid, name tables that exist, etc.) before enqueueing * them, but they may still fail upon later execution (e.g., if a statement from another batch of * statements is applied first and it conflicts in some way, or if there is some data-related * problem like a `NULL` value in a column to which `NOT NULL` would be added). If a statement * fails, all subsequent statements in the batch are automatically cancelled. * * @param operationId Operation id assigned to this operation. If null, system will autogenerate * one. This must be unique within a database abd must be a valid identifier * [a-zA-Z][a-zA-Z0-9_]*. */ public OperationFuture<Void, UpdateDatabaseDdlMetadata> updateDdl( Iterable<String> statements, String operationId) throws SpannerException { return dbClient.updateDatabaseDdl(instance(), database(), statements, operationId); }
dbAdminClient.createDatabase( instanceId, databaseId,
/** Drops this database. */ public void drop() throws SpannerException { dbClient.dropDatabase(instance(), database()); }
public Page<Database> listDatabases() { return dbClient.listDatabases(instanceId()); }