Skip to content

Commit 4b24f33

Browse files
authored
fix: map now() to current_timestamp (#540)
Fixes #497
1 parent 7952799 commit 4b24f33

File tree

3 files changed

+37
-6
lines changed

3 files changed

+37
-6
lines changed

google/cloud/sqlalchemy_spanner/sqlalchemy_spanner.py

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -235,6 +235,9 @@ def get_from_hint_text(self, _, text):
235235
"""
236236
return text
237237

238+
def visit_now_func(self, func, **kwargs):
239+
return "current_timestamp"
240+
238241
def visit_empty_set_expr(self, type_, **kw):
239242
"""Return an empty set expression of the given type.
240243

test/mockserver_tests/mock_server_test_base.py

Lines changed: 11 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -22,6 +22,7 @@
2222
Client,
2323
ResultSet,
2424
PingingPool,
25+
TypeCode,
2526
)
2627
from google.cloud.spanner_v1.database import Database
2728
from google.cloud.spanner_v1.instance import Instance
@@ -48,6 +49,12 @@ def add_update_count(
4849

4950

5051
def add_select1_result():
52+
add_single_result("select 1", "c", TypeCode.INT64, [("1",)])
53+
54+
55+
def add_single_result(
56+
sql: str, column_name: str, type_code: spanner_type.TypeCode, row
57+
):
5158
result = result_set.ResultSet(
5259
dict(
5360
metadata=result_set.ResultSetMetadata(
@@ -57,10 +64,8 @@ def add_select1_result():
5764
fields=[
5865
spanner_type.StructType.Field(
5966
dict(
60-
name="c",
61-
type=spanner_type.Type(
62-
dict(code=spanner_type.TypeCode.INT64)
63-
),
67+
name=column_name,
68+
type=spanner_type.Type(dict(code=type_code)),
6469
)
6570
)
6671
]
@@ -70,8 +75,8 @@ def add_select1_result():
7075
),
7176
)
7277
)
73-
result.rows.extend(["1"])
74-
MockServerTestBase.spanner_service.mock_spanner.add_result("select 1", result)
78+
result.rows.extend(row)
79+
MockServerTestBase.spanner_service.mock_spanner.add_result(sql, result)
7580

7681

7782
class MockServerTestBase(fixtures.TestBase):

test/mockserver_tests/test_basics.py

Lines changed: 23 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -12,6 +12,7 @@
1212
# See the License for the specific language governing permissions and
1313
# limitations under the License.
1414

15+
import datetime
1516
from google.cloud.spanner_admin_database_v1 import UpdateDatabaseDdlRequest
1617
from google.cloud.spanner_dbapi.parsed_statement import AutocommitDmlMode
1718
from sqlalchemy import (
@@ -22,6 +23,7 @@
2223
Column,
2324
Integer,
2425
String,
26+
func,
2527
text,
2628
)
2729
from sqlalchemy.testing import eq_, is_instance_of
@@ -31,11 +33,13 @@
3133
ExecuteSqlRequest,
3234
ResultSet,
3335
PingingPool,
36+
TypeCode,
3437
)
3538
from test.mockserver_tests.mock_server_test_base import (
3639
MockServerTestBase,
3740
add_select1_result,
3841
add_result,
42+
add_single_result,
3943
add_update_count,
4044
)
4145

@@ -70,6 +74,25 @@ def test_sqlalchemy_select1(self):
7074
results = connection.execute(select(1)).fetchall()
7175
self.verify_select1(results)
7276

77+
def test_sqlalchemy_select_now(self):
78+
now = datetime.datetime.now(datetime.UTC)
79+
iso_now = now.isoformat().replace("+00:00", "Z")
80+
add_single_result(
81+
"SELECT current_timestamp AS now_1",
82+
"now_1",
83+
TypeCode.TIMESTAMP,
84+
[(iso_now,)],
85+
)
86+
engine = create_engine(
87+
"spanner:///projects/p/instances/i/databases/d",
88+
connect_args={"client": self.client, "pool": PingingPool(size=10)},
89+
)
90+
with engine.connect().execution_options(
91+
isolation_level="AUTOCOMMIT"
92+
) as connection:
93+
spanner_now = connection.execute(select(func.now())).fetchone()[0]
94+
eq_(spanner_now.timestamp(), now.timestamp())
95+
7396
def test_create_table(self):
7497
add_result(
7598
"""SELECT true

0 commit comments

Comments
 (0)