Prepare seu ambiente C++ local Clone o repositório do aplicativo de exemplo na sua máquina local:
git clone https : //github.com/googleapis/google-cloud-cpp $HOME/google-cloud-cpp
Instale o Bazel para Linux usando estas instruções .
Mude para o diretório que contém o código de exemplo do Spanner:
cd $HOME / google - cloud - cpp
Crie os exemplos com este comando:
bazel build //google/cloud/spanner/samples:samples
Configure a autenticação e a autorização para o projeto google-cloud-cpp
.
gcloud auth application - default login
Crie uma variável de ambiente chamada GCLOUD_PROJECT
. Substitua [MY_PROJECT_ID] pelo seu Google Cloud ID do projeto. Você pode encontrar esse ID na página de boas-vindas do seu projeto.
export GCLOUD_PROJECT = [ MY_PROJECT_ID ]
Criar uma instância Ao usar o Spanner pela primeira vez, você precisa criar uma instância, que é uma alocação de recursos usados pelos bancos de dados do Spanner. Ao criar uma instância, você escolhe uma configuração de instância , que determina onde seus dados serão armazenados, e também o número de nós a serem usados, que determina a quantidade de recursos de serviço e armazenamento na sua instância.
Execute o seguinte comando para criar uma instância do Spanner na região us-central1
com 1 nó:
gcloud spanner instances create test-instance --config= regional-us-central1 \
--description= "Test Instance" --nodes= 1
Observe que isso cria uma instância com as seguintes características:
ID da instância test-instance
Nome de exibição Test Instance
Configuração de instância regional-us-central1
(Configurações regionais armazenam dados em uma região, enquanto configurações multirregionais distribuem dados entre várias regiões. Para obter mais informações, consulte Sobre instâncias .) Contagem de nós de 1 ( node_count
corresponde à quantidade de recursos de serviço e armazenamento disponíveis para bancos de dados na instância. Saiba mais em Nós e unidades de processamento .) Você deverá ver:
Creating instance ... done .
Veja os arquivos de amostra O repositório de exemplos contém um exemplo que mostra como usar o Spanner com C++.
Dê uma olhada no arquivo google/cloud/spanner/samples/samples.cc
, que mostra como criar um banco de dados e modificar um esquema de banco de dados. Os dados usam o esquema de exemplo mostrado na página Esquema e modelo de dados .
Criar um banco de dados GoogleSQL
bazel run //google/cloud/spanner/samples:samples -- \
create-database $GCLOUD_PROJECT test-instance example-db
PostgreSQL
bazel run //google/cloud/spanner/samples:postgresql_samples -- \
create-database $GCLOUD_PROJECT test-instance example-db
bazel run //google/cloud/spanner/samples:postgresql_samples -- \
interleaved-table $GCLOUD_PROJECT test-instance example-db
Observação: Algumas sintaxes do Bazel, como --
, parecem semelhantes à sintaxe do bash, mas não são. Para mais informações, consulte a página Comandos e Opções do Bazel. Você deverá ver:
Created database [ projects / $ { GCLOUD_PROJECT } / instances / test - instance / databases / example - db ]
O código a seguir cria um banco de dados e duas tabelas no banco de dados. Observação: os exemplos de código subsequentes usam essas duas tabelas. Se você não executar este código, crie as tabelas usando o comando Google Cloud console ou a CLI do gcloud. Para obter mais informações, consulte o esquema de exemplo . PostgreSQL No dialeto PostgreSQL, o banco de dados precisa ser criado antes de enviar uma solicitação DDL para criar uma tabela.
O exemplo a seguir cria um banco de dados:
O exemplo a seguir cria as duas tabelas no banco de dados:
O próximo passo é gravar dados no seu banco de dados.
Criar um cliente de banco de dados Antes de poder fazer leituras ou gravações, você deve criar um Client
:
Um Client
permite ler, escrever, consultar e executar transações em um banco de dados Spanner. Normalmente, você cria um Client
quando seu aplicativo é inicializado e, em seguida, reutiliza esse Client
para ler, escrever e executar transações. Cada cliente utiliza recursos do Spanner. O destruidor do Client
limpará automaticamente os recursos Client
, incluindo as conexões de rede.
Leia mais sobre Client
no Google Cloud Referência do Spanner C++ .
Escrever dados com DML Você pode inserir dados usando Linguagem de Manipulação de Dados (DML) em uma transação de leitura e gravação.
Use a função Client::ExecuteDml()
para executar uma instrução DML.
Execute o exemplo usando o argumento getting-started-insert
.
bazel run //google/cloud/spanner/samples:samples -- \
getting-started-insert $GCLOUD_PROJECT test-instance example-db
Você deverá ver:
Insert was successful [ spanner_dml_getting_started_insert ]
Observação: há limites para o tamanho do commit. Consulte Limite de CRUD para obter mais informações.
Escrever dados com mutações Você também pode inserir dados usando mutações .
Você grava dados usando um objeto Client
. A função Client::Commit()
cria e confirma uma transação para gravações que são executadas atomicamente em um único ponto lógico no tempo em colunas, linhas e tabelas em um banco de dados.
Este código mostra como escrever os dados usando mutações:
Execute o exemplo usando o argumento insert-data
.
bazel run //google/cloud/spanner/samples:samples -- \
insert-data $GCLOUD_PROJECT test-instance example-db
Você deverá ver:
Insert was successful [ spanner_insert_data ]
Observação: há limites para o tamanho do commit. Consulte Limite de CRUD para obter mais informações. Consultar dados usando SQL O Spanner oferece suporte a uma interface SQL para leitura de dados, que você pode acessar na linha de comando usando o Google Cloud CLI ou programaticamente usando a biblioteca de cliente Spanner para C++.
Na linha de comando Execute a seguinte instrução SQL para ler os valores de todas as colunas da tabela Albums
:
gcloud spanner databases execute - sql example - db -- instance = test - instance \
-- sql = ' SELECT SingerId , AlbumId , AlbumTitle FROM Albums '
O resultado deve ser:
SingerId AlbumId AlbumTitle
1 1 Total Junk
1 2 Go , Go , Go
2 1 Green
2 2 Forever Hold Your Peace
2 3 Terrified
Use a biblioteca cliente Spanner para C++ Além de executar uma instrução SQL na linha de comando, você pode emitir a mesma instrução SQL programaticamente usando a biblioteca de cliente Spanner para C++.
Use a função Client::ExecuteQuery()
para executar a consulta SQL. Veja como emitir a consulta e acessar os dados:
Execute o exemplo usando o argumento query_data
.
bazel run //google/cloud/spanner/samples:samples -- \
query-data $GCLOUD_PROJECT test-instance example-db
Você deverá ver o seguinte resultado:
SingerId : 1 LastName : Richards
SingerId : 2 LastName : Smith
SingerId : 3 LastName : Trentor
SingerId : 4 LastName : Martin
SingerId : 5 LastName : Lomond
SingerId : 12 LastName : Garcia
SingerId : 13 LastName : Morales
SingerId : 14 LastName : Long
SingerId : 15 LastName : Shaw
Consulta usando um parâmetro SQL Se o seu aplicativo tiver uma consulta executada com frequência, você pode melhorar seu desempenho parametrizando-a. A consulta paramétrica resultante pode ser armazenada em cache e reutilizada, o que reduz os custos de compilação. Para obter mais informações, consulte Usar parâmetros de consulta para acelerar consultas executadas com frequência .
Aqui está um exemplo de uso de um parâmetro na cláusula WHERE
para consultar registros que contêm um valor específico para LastName
.
Execute o exemplo usando o comando query-with-parameter.
bazel run //google/cloud/spanner/samples:samples -- \
query-with-parameter $GCLOUD_PROJECT test-instance example-db
Você deverá ver o seguinte resultado:
SingerId : 12 FirstName : Melissa LastName : Garcia
Ler dados usando a API de leitura Além da interface SQL do Spanner, o Spanner também suporta uma interface de leitura.
Use a função Client::Read()
para ler linhas do banco de dados. Use um objeto KeySet
para definir uma coleção de chaves e intervalos de chaves para leitura.
Veja como ler os dados:
Execute o exemplo usando o argumento read-data
.
bazel run //google/cloud/spanner/samples:samples -- \
read-data $GCLOUD_PROJECT test-instance example-db
Você deverá ver uma saída semelhante a:
SingerId : 1 , AlbumId : 1 , AlbumTitle : Total Junk
SingerId : 1 , AlbumId : 2 , AlbumTitle : Go , Go , Go
SingerId : 2 , AlbumId : 1 , AlbumTitle : Green
SingerId : 2 , AlbumId : 2 , AlbumTitle : Forever Hold Your Peace
SingerId : 2 , AlbumId : 3 , AlbumTitle : Terrified
Atualizar o esquema do banco de dados Suponha que você precise adicionar uma nova coluna chamada MarketingBudget
à tabela Albums
. Adicionar uma nova coluna a uma tabela existente requer uma atualização do esquema do seu banco de dados. O Spanner suporta atualizações de esquema em um banco de dados enquanto este continua a servir tráfego. As atualizações de esquema não exigem que o banco de dados fique offline e não bloqueiam tabelas ou colunas inteiras; você pode continuar gravando dados no banco de dados durante a atualização do esquema. Saiba mais sobre as atualizações de esquema suportadas e o desempenho das alterações de esquema em Fazer atualizações de esquema .
Adicionar uma coluna Você pode adicionar uma coluna na linha de comando usando o Google Cloud CLI ou programaticamente usando a biblioteca de cliente Spanner para C++.
Na linha de comando Use o seguinte comando ALTER TABLE
para adicionar a nova coluna à tabela:
GoogleSQL
gcloud spanner databases ddl update example - db -- instance = test - instance \
-- ddl = ' ALTER TABLE Albums ADD COLUMN MarketingBudget INT64 '
PostgreSQL
gcloud spanner databases ddl update example - db -- instance = test - instance \
-- ddl = ' ALTER TABLE Albums ADD COLUMN MarketingBudget BIGINT '
Você deverá ver:
Schema updating ... done .
Use a biblioteca cliente Spanner para C++ Use a função DatabaseAdminClient::UpdateDatabase()
para modificar o esquema.
Execute o exemplo usando o comando add-column
.
bazel run //google/cloud/spanner/samples:samples -- \
add-column $GCLOUD_PROJECT test-instance example-db
Você deverá ver:
Added MarketingBudget column
Grave dados na nova coluna O código a seguir grava dados na nova coluna. Ele define MarketingBudget
como 100000
para a linha indexada por Albums(1, 1)
e como 500000
para a linha indexada por Albums(2, 2)
.
Execute o exemplo usando o argumento update-data
.
bazel run //google/cloud/spanner/samples:samples -- \
update-data $GCLOUD_PROJECT test-instance example-db
Você também pode executar uma consulta SQL ou uma chamada de leitura para buscar os valores que acabou de escrever.
Aqui está o código para executar a consulta:
Para executar esta consulta, execute o exemplo usando o argumento query-new-column
.
bazel run //google/cloud/spanner/samples:samples -- \
query-new-column $GCLOUD_PROJECT test-instance example-db
Você deverá ver:
SingerId : 1 AlbumId : 1 MarketingBudget : 100000
SingerId : 1 AlbumId : 2 MarketingBudget : NULL
SingerId : 2 AlbumId : 1 MarketingBudget : NULL
SingerId : 2 AlbumId : 2 MarketingBudget : 500000
SingerId : 2 AlbumId : 3 MarketingBudget : NULL
Atualizar dados Você pode atualizar dados usando DML em uma transação de leitura e gravação.
Use a função Client::ExecuteDml()
para executar uma instrução DML.
Execute o exemplo usando o argumento getting-started-update
.
bazel run //google/cloud/spanner/samples:samples -- \
getting-started-update $GCLOUD_PROJECT test-instance example-db
Você deverá ver:
Update was successful [ spanner_dml_getting_started_update ]
Use um índice secundário Suponha que você queira buscar todas as linhas de Albums
que possuem valores AlbumTitle
em um determinado intervalo. Você poderia ler todos os valores da coluna AlbumTitle
usando uma instrução SQL ou uma chamada de leitura e, em seguida, descartar as linhas que não atendem aos critérios, mas realizar essa varredura completa da tabela é caro, especialmente para tabelas com muitas linhas. Em vez disso, você pode acelerar a recuperação de linhas ao pesquisar por colunas que não sejam de chave primária criando um índice secundário na tabela.
Adicionar um índice secundário a uma tabela existente requer uma atualização de esquema. Assim como outras atualizações de esquema, o Spanner permite a adição de um índice enquanto o banco de dados continua a servir tráfego. O Spanner preenche automaticamente o índice com os dados existentes. Os preenchimentos podem levar alguns minutos para serem concluídos, mas você não precisa desconectar o banco de dados nem evitar gravar na tabela indexada durante esse processo. Para obter mais detalhes, consulte Adicionar um índice secundário .
Após adicionar um índice secundário, o Spanner o utiliza automaticamente para consultas SQL que provavelmente serão executadas mais rapidamente com o índice. Se você usar a interface de leitura, deverá especificar o índice que deseja usar.
Adicionar um índice secundário Você pode adicionar um índice na linha de comando usando o gcloud CLI ou programaticamente usando a biblioteca de cliente Spanner para C++.
Na linha de comando Use o seguinte comando CREATE INDEX
para adicionar um índice ao banco de dados:
gcloud spanner databases ddl update example-db --instance= test-instance \
--ddl= 'CREATE INDEX AlbumsByAlbumTitle ON Albums(AlbumTitle)'
Você deverá ver:
Schema updating ... done .
Usando a biblioteca cliente Spanner para C++ Use a função DatabaseAdminClient::UpdateDatabase()
para adicionar um índice:
Execute o exemplo usando o argumento add-index
.
bazel run //google/cloud/spanner/samples:samples -- \
add-index $GCLOUD_PROJECT test-instance example-db
Adicionar um índice pode levar alguns minutos. Após adicioná-lo, você deverá ver uma saída semelhante a esta:
` AlbumsByAlbumTitle ` Index successfully added , new DDL :
database : "projects/$GCLOUD_PROJECT/instances/test-instance/databases/example-db"
statements : "CREATE INDEX AlbumsByAlbumTitle ON Albums(AlbumTitle)"
commit_timestamps {
seconds : 1581011550
nanos : 531102000
}
Leia usando o índice Para consultas SQL, o Spanner usa automaticamente um índice apropriado. Na interface de leitura, você deve especificar o índice na sua solicitação.
Para usar o índice na interface de leitura, use a função Client::Read()
, que lê zero ou mais linhas de um banco de dados usando um índice.
O código a seguir busca todas as colunas AlbumId
e AlbumTitle
do índice AlbumsByAlbumTitle
.
Execute o exemplo usando o argumento read-data-with-index
.
bazel run //google/cloud/spanner/samples:samples -- \
read-data-with-index $GCLOUD_PROJECT test-instance example-db
Você deverá ver:
AlbumId : 2 AlbumTitle : Forever Hold Your Peace
AlbumId : 2 AlbumTitle : Go , Go , Go
AlbumId : 1 AlbumTitle : Green
AlbumId : 3 AlbumTitle : Terrified
AlbumId : 1 AlbumTitle : Total Junk
Adicionar um índice para leituras somente de índice Você deve ter notado que o exemplo de leitura anterior não inclui a leitura da coluna MarketingBudget
. Isso ocorre porque a interface de leitura do Spanner não suporta a capacidade de unir um índice a uma tabela de dados para pesquisar valores que não estão armazenados no índice.
Crie uma definição alternativa de AlbumsByAlbumTitle
que armazene uma cópia de MarketingBudget
no índice.
Na linha de comando GoogleSQL
gcloud spanner databases ddl update example - db -- instance = test - instance \
-- ddl = ' CREATE INDEX AlbumsByAlbumTitle2 ON Albums ( AlbumTitle ) STORING ( MarketingBudget )
PostgreSQL
gcloud spanner databases ddl update example - db -- instance = test - instance \
-- ddl = ' CREATE INDEX AlbumsByAlbumTitle2 ON Albums ( AlbumTitle ) INCLUDE ( MarketingBudget )
Adicionar um índice pode levar alguns minutos. Após adicioná-lo, você deverá ver:
Schema updating ... done .
Usando a biblioteca cliente Spanner para C++ Use a função DatabaseAdminClient::UpdateDatabase()
para adicionar um índice com uma cláusula STORING
para:
Execute o exemplo usando o argumento add-storing-index
.
bazel run //google/cloud/spanner/samples:samples -- \
add-storing-index $GCLOUD_PROJECT test-instance example-db
Você deverá ver uma saída semelhante a esta:
` AlbumsByAlbumTitle2 ` Index successfully added , new DDL :
database : "projects/$GCLOUD_PROJECT/instances/test-instance/databases/example-db"
statements : "CREATE INDEX AlbumsByAlbumTitle2 ON Albums(AlbumTitle) STORING (MarketingBudget)"
commit_timestamps {
seconds : 1581012328
nanos : 416682000
}
Agora você pode executar uma leitura que busca todas as colunas AlbumId
, AlbumTitle
e MarketingBudget
do índice AlbumsByAlbumTitle2
:
Leia os dados usando o índice de armazenamento que você criou executando uma consulta que especifica explicitamente o índice:
Execute o exemplo usando o argumento read-data-with-storing-index
.
bazel run //google/cloud/spanner/samples:samples -- \
read-data-with-storing-index $GCLOUD_PROJECT test-instance example-db
Você deverá ver uma saída semelhante a:
AlbumId : 2 AlbumTitle : Forever Hold Your Peace MarketingBudget : 520000
AlbumId : 2 AlbumTitle : Go , Go , Go MarketingBudget : NULL
AlbumId : 1 AlbumTitle : Green MarketingBudget : NULL
AlbumId : 3 AlbumTitle : Terrified MarketingBudget : NULL
AlbumId : 1 AlbumTitle : Total Junk MarketingBudget : 80000
Recuperar dados usando transações somente leitura Suponha que você queira executar mais de uma leitura no mesmo registro de data e hora. Transações somente leitura observam um prefixo consistente do histórico de confirmações da transação, de modo que seu aplicativo sempre obtém dados consistentes. O tipo Transaction
é usado para representar todos os tipos de transações. Use a função de fábrica MakeReadOnlyTransaction()
para criar uma transação somente leitura.