1818Spanner PostgreSql dialect.
1919For more information, see the README.rst under /spanner.
2020"""
21- from google .cloud import spanner
21+ from google .cloud import spanner , spanner_admin_database_v1
2222from google .cloud .spanner_admin_database_v1 .types .common import DatabaseDialect
2323
2424OPERATION_TIMEOUT_SECONDS = 240
2525
2626
27- # [START spanner_postgresql_create_database]
28- def create_database (instance_id , database_id ):
29- """Creates a PostgreSql database and tables for sample data."""
30-
31- from google .cloud .spanner_admin_database_v1 .types import spanner_database_admin
32-
33- spanner_client = spanner .Client ()
34- instance = spanner_client .instance (instance_id )
35-
36- request = spanner_database_admin .CreateDatabaseRequest (
37- parent = instance .name ,
38- create_statement = f'CREATE DATABASE "{ database_id } "' ,
39- database_dialect = DatabaseDialect .POSTGRESQL ,
40- )
41-
42- operation = spanner_client .database_admin_api .create_database (request = request )
43-
44- print ("Waiting for operation to complete..." )
45- database = operation .result (OPERATION_TIMEOUT_SECONDS )
46-
47- create_table_using_ddl (database .name )
48- print ("Created database {} on instance {}" .format (database_id , instance_id ))
49-
50-
51- def create_table_using_ddl (database_name ):
52- from google .cloud .spanner_admin_database_v1 .types import spanner_database_admin
53-
54- spanner_client = spanner .Client ()
55- request = spanner_database_admin .UpdateDatabaseDdlRequest (
56- database = database_name ,
57- statements = [
58- """CREATE TABLE Singers (
59- SingerId bigint NOT NULL,
60- FirstName character varying(1024),
61- LastName character varying(1024),
62- SingerInfo bytea,
63- FullName character varying(2048)
64- GENERATED ALWAYS AS (FirstName || ' ' || LastName) STORED,
65- PRIMARY KEY (SingerId)
66- )""" ,
67- """CREATE TABLE Albums (
68- SingerId bigint NOT NULL,
69- AlbumId bigint NOT NULL,
70- AlbumTitle character varying(1024),
71- PRIMARY KEY (SingerId, AlbumId)
72- ) INTERLEAVE IN PARENT Singers ON DELETE CASCADE""" ,
73- ],
74- )
75- operation = spanner_client .database_admin_api .update_database_ddl (request )
76- operation .result (OPERATION_TIMEOUT_SECONDS )
77-
78-
79- # [END spanner_postgresql_create_database]
80-
81-
82- def create_table_with_datatypes (instance_id , database_id ):
83- """Creates a table with supported datatypes."""
84- # [START spanner_postgresql_create_table_with_datatypes]
85- # instance_id = "your-spanner-instance"
86- # database_id = "your-spanner-db-id"
87-
88- from google .cloud .spanner_admin_database_v1 .types import spanner_database_admin
89-
90- spanner_client = spanner .Client ()
91- instance = spanner_client .instance (instance_id )
92- database = instance .database (database_id )
93-
94- request = spanner_database_admin .UpdateDatabaseDdlRequest (
95- database = database .name ,
96- statements = [
97- """CREATE TABLE Venues (
98- VenueId BIGINT NOT NULL,
99- VenueName character varying(100),
100- VenueInfo BYTEA,
101- Capacity BIGINT,
102- OutdoorVenue BOOL,
103- PopularityScore FLOAT8,
104- Revenue NUMERIC,
105- LastUpdateTime SPANNER.COMMIT_TIMESTAMP NOT NULL,
106- PRIMARY KEY (VenueId))"""
107- ],
108- )
109- operation = spanner_client .database_admin_api .update_database_ddl (request )
110-
111- print ("Waiting for operation to complete..." )
112- operation .result (OPERATION_TIMEOUT_SECONDS )
113-
114- print (
115- "Created Venues table on database {} on instance {}" .format (
116- database_id , instance_id
117- )
118- )
119- # [END spanner_postgresql_create_table_with_datatypes]
120-
121-
12227# [START spanner_postgresql_add_column]
12328def add_column (instance_id , database_id ):
12429 """Adds a new column to the Albums table in the example database."""
125-
126- from google .cloud .spanner_admin_database_v1 .types import spanner_database_admin
127-
12830 spanner_client = spanner .Client ()
12931 instance = spanner_client .instance (instance_id )
13032 database = instance .database (database_id )
13133
132- request = spanner_database_admin .UpdateDatabaseDdlRequest (
133- database = database .name ,
134- statements = ["ALTER TABLE Albums ADD COLUMN MarketingBudget BIGINT" ],
34+ operation = database .update_ddl (
35+ ["ALTER TABLE Albums ADD COLUMN MarketingBudget BIGINT" ]
13536 )
136- operation = spanner_client .database_admin_api .update_database_ddl (request )
13737
13838 print ("Waiting for operation to complete..." )
13939 operation .result (OPERATION_TIMEOUT_SECONDS )
@@ -164,19 +64,14 @@ def add_jsonb_column(instance_id, database_id):
16464 # instance_id = "your-spanner-instance"
16565 # database_id = "your-spanner-db-id"
16666
167- from google .cloud .spanner_admin_database_v1 .types import spanner_database_admin
168-
16967 spanner_client = spanner .Client ()
17068 instance = spanner_client .instance (instance_id )
17169 database = instance .database (database_id )
17270
173- request = spanner_database_admin .UpdateDatabaseDdlRequest (
174- database = database .name ,
175- statements = ["ALTER TABLE Venues ADD COLUMN VenueDetails JSONB" ],
71+ operation = database .update_ddl (
72+ ["ALTER TABLE Venues ADD COLUMN VenueDetails JSONB" ]
17673 )
17774
178- operation = spanner_client .database_admin_api .update_database_ddl (request )
179-
18075 print ("Waiting for operation to complete..." )
18176 operation .result (OPERATION_TIMEOUT_SECONDS )
18277
@@ -190,46 +85,103 @@ def add_jsonb_column(instance_id, database_id):
19085# [END spanner_postgresql_jsonb_add_column]
19186
19287
193- # [START spanner_postgresql_create_storing_index]
194- def add_storing_index (instance_id , database_id ):
195- """Adds an storing index to the example database."""
88+ # [START spanner_postgresql_alter_sequence]
89+ def alter_sequence (instance_id , database_id ):
90+ """Alters the Sequence and insert data"""
91+ spanner_client = spanner .Client ()
92+ instance = spanner_client .instance (instance_id )
93+ database = instance .database (database_id )
94+
95+ operation = database .update_ddl (["ALTER SEQUENCE Seq SKIP RANGE 1000 5000000" ])
96+
97+ print ("Waiting for operation to complete..." )
98+ operation .result (OPERATION_TIMEOUT_SECONDS )
99+
100+ print (
101+ "Altered Seq sequence to skip an inclusive range between 1000 and 5000000 on database {} on instance {}" .format (
102+ database_id , instance_id
103+ )
104+ )
105+
106+ def insert_customers (transaction ):
107+ results = transaction .execute_sql (
108+ "INSERT INTO Customers (CustomerName) VALUES "
109+ "('Lea'), "
110+ "('Cataline'), "
111+ "('Smith') "
112+ "RETURNING CustomerId"
113+ )
114+ for result in results :
115+ print ("Inserted customer record with Customer Id: {}" .format (* result ))
116+ print (
117+ "Number of customer records inserted is {}" .format (
118+ results .stats .row_count_exact
119+ )
120+ )
121+
122+ database .run_in_transaction (insert_customers )
123+
124+
125+ # [END spanner_postgresql_alter_sequence]
196126
197- from google .cloud .spanner_admin_database_v1 .types import spanner_database_admin
198127
128+ # [START spanner_postgresql_create_database]
129+ def create_database (instance_id , database_id ):
130+ """Creates a PostgreSql database and tables for sample data."""
199131 spanner_client = spanner .Client ()
200132 instance = spanner_client .instance (instance_id )
201- database = instance .database (database_id )
202133
203- request = spanner_database_admin .UpdateDatabaseDdlRequest (
204- database = database .name ,
205- statements = [
206- "CREATE INDEX AlbumsByAlbumTitle2 ON Albums(AlbumTitle)"
207- "INCLUDE (MarketingBudget)"
208- ],
134+ database = instance .database (
135+ database_id ,
136+ database_dialect = DatabaseDialect .POSTGRESQL ,
209137 )
210138
211- operation = spanner_client . database_admin_api . update_database_ddl ( request )
139+ operation = database . create ( )
212140
213141 print ("Waiting for operation to complete..." )
214142 operation .result (OPERATION_TIMEOUT_SECONDS )
215143
216- print ("Added the AlbumsByAlbumTitle2 index." )
144+ create_table_using_ddl (database .name )
145+ print ("Created database {} on instance {}" .format (database_id , instance_id ))
217146
218147
219- # [END spanner_postgresql_create_storing_index]
148+ def create_table_using_ddl (database_name ):
149+ spanner_client = spanner .Client ()
150+ request = spanner_admin_database_v1 .UpdateDatabaseDdlRequest (
151+ database = database_name ,
152+ statements = [
153+ """CREATE TABLE Singers (
154+ SingerId bigint NOT NULL,
155+ FirstName character varying(1024),
156+ LastName character varying(1024),
157+ SingerInfo bytea,
158+ FullName character varying(2048)
159+ GENERATED ALWAYS AS (FirstName || ' ' || LastName) STORED,
160+ PRIMARY KEY (SingerId)
161+ )""" ,
162+ """CREATE TABLE Albums (
163+ SingerId bigint NOT NULL,
164+ AlbumId bigint NOT NULL,
165+ AlbumTitle character varying(1024),
166+ PRIMARY KEY (SingerId, AlbumId)
167+ ) INTERLEAVE IN PARENT Singers ON DELETE CASCADE""" ,
168+ ],
169+ )
170+ operation = spanner_client .database_admin_api .update_database_ddl (request )
171+ operation .result (OPERATION_TIMEOUT_SECONDS )
172+
173+
174+ # [END spanner_postgresql_create_database]
220175
221176
222177# [START spanner_postgresql_create_sequence]
223178def create_sequence (instance_id , database_id ):
224179 """Creates the Sequence and insert data"""
225-
226- from google .cloud .spanner_admin_database_v1 .types import spanner_database_admin
227-
228180 spanner_client = spanner .Client ()
229181 instance = spanner_client .instance (instance_id )
230182 database = instance .database (database_id )
231183
232- request = spanner_database_admin .UpdateDatabaseDdlRequest (
184+ request = spanner_admin_database_v1 .UpdateDatabaseDdlRequest (
233185 database = database .name ,
234186 statements = [
235187 "CREATE SEQUENCE Seq BIT_REVERSED_POSITIVE" ,
@@ -272,68 +224,78 @@ def insert_customers(transaction):
272224# [END spanner_postgresql_create_sequence]
273225
274226
275- # [START spanner_postgresql_alter_sequence]
276- def alter_sequence (instance_id , database_id ):
277- """Alters the Sequence and insert data"""
227+ # [START spanner_postgresql_create_storing_index]
228+ def add_storing_index (instance_id , database_id ):
229+ """Adds an storing index to the example database."""
230+ spanner_client = spanner .Client ()
231+ instance = spanner_client .instance (instance_id )
232+ database = instance .database (database_id )
233+
234+ operation = database .update_ddl (
235+ [
236+ "CREATE INDEX AlbumsByAlbumTitle2 ON Albums(AlbumTitle)"
237+ "INCLUDE (MarketingBudget)"
238+ ]
239+ )
278240
279- from google .cloud .spanner_admin_database_v1 .types import spanner_database_admin
241+ print ("Waiting for operation to complete..." )
242+ operation .result (OPERATION_TIMEOUT_SECONDS )
280243
244+ print ("Added the AlbumsByAlbumTitle2 index." )
245+
246+
247+ # [END spanner_postgresql_create_storing_index]
248+
249+
250+ # [START spanner_postgresql_drop_sequence]
251+ def drop_sequence (instance_id , database_id ):
252+ """Drops the Sequence"""
281253 spanner_client = spanner .Client ()
282254 instance = spanner_client .instance (instance_id )
283255 database = instance .database (database_id )
284256
285- request = spanner_database_admin .UpdateDatabaseDdlRequest (
286- database = database .name ,
287- statements = ["ALTER SEQUENCE Seq SKIP RANGE 1000 5000000" ],
257+ operation = database .update_ddl (
258+ [
259+ "ALTER TABLE Customers ALTER COLUMN CustomerId DROP DEFAULT" ,
260+ "DROP SEQUENCE Seq" ,
261+ ]
288262 )
289- operation = spanner_client .database_admin_api .update_database_ddl (request )
290263
291264 print ("Waiting for operation to complete..." )
292265 operation .result (OPERATION_TIMEOUT_SECONDS )
293266
294267 print (
295- "Altered Seq sequence to skip an inclusive range between 1000 and 5000000 on database {} on instance {}" .format (
268+ "Altered Customers table to drop DEFAULT from CustomerId column and dropped the Seq sequence on database {} on instance {}" .format (
296269 database_id , instance_id
297270 )
298271 )
299272
300- def insert_customers (transaction ):
301- results = transaction .execute_sql (
302- "INSERT INTO Customers (CustomerName) VALUES "
303- "('Lea'), "
304- "('Cataline'), "
305- "('Smith') "
306- "RETURNING CustomerId"
307- )
308- for result in results :
309- print ("Inserted customer record with Customer Id: {}" .format (* result ))
310- print (
311- "Number of customer records inserted is {}" .format (
312- results .stats .row_count_exact
313- )
314- )
315-
316- database .run_in_transaction (insert_customers )
317273
274+ # [END spanner_postgresql_drop_sequence]
318275
319- # [END spanner_postgresql_alter_sequence]
320-
321-
322- # [START spanner_postgresql_drop_sequence]
323- def drop_sequence (instance_id , database_id ):
324- """Drops the Sequence"""
325-
326- from google .cloud .spanner_admin_database_v1 .types import spanner_database_admin
327276
277+ def create_table_with_datatypes (instance_id , database_id ):
278+ """Creates a table with supported datatypes."""
279+ # [START spanner_postgresql_create_table_with_datatypes]
280+ # instance_id = "your-spanner-instance"
281+ # database_id = "your-spanner-db-id"
328282 spanner_client = spanner .Client ()
329283 instance = spanner_client .instance (instance_id )
330284 database = instance .database (database_id )
331285
332- request = spanner_database_admin .UpdateDatabaseDdlRequest (
286+ request = spanner_admin_database_v1 .UpdateDatabaseDdlRequest (
333287 database = database .name ,
334288 statements = [
335- "ALTER TABLE Customers ALTER COLUMN CustomerId DROP DEFAULT" ,
336- "DROP SEQUENCE Seq" ,
289+ """CREATE TABLE Venues (
290+ VenueId BIGINT NOT NULL,
291+ VenueName character varying(100),
292+ VenueInfo BYTEA,
293+ Capacity BIGINT,
294+ OutdoorVenue BOOL,
295+ PopularityScore FLOAT8,
296+ Revenue NUMERIC,
297+ LastUpdateTime SPANNER.COMMIT_TIMESTAMP NOT NULL,
298+ PRIMARY KEY (VenueId))"""
337299 ],
338300 )
339301 operation = spanner_client .database_admin_api .update_database_ddl (request )
@@ -342,10 +304,8 @@ def drop_sequence(instance_id, database_id):
342304 operation .result (OPERATION_TIMEOUT_SECONDS )
343305
344306 print (
345- "Altered Customers table to drop DEFAULT from CustomerId column and dropped the Seq sequence on database {} on instance {}" .format (
307+ "Created Venues table on database {} on instance {}" .format (
346308 database_id , instance_id
347309 )
348310 )
349-
350-
351- # [END spanner_postgresql_drop_sequence]
311+ # [END spanner_postgresql_create_table_with_datatypes]
0 commit comments