Skip to content

Commit 5f84b93

Browse files
committed
fix: map now() to current_timestamp
Fixes #497
1 parent 3944cea commit 5f84b93

File tree

3 files changed

+46
-7
lines changed

3 files changed

+46
-7
lines changed

google/cloud/sqlalchemy_spanner/sqlalchemy_spanner.py

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

236+
def visit_now_func(self, func, **kwargs):
237+
return "current_timestamp"
238+
236239
def visit_empty_set_expr(self, type_, **kw):
237240
"""Return an empty set expression of the given type.
238241

test/mockserver_tests/mock_server_test_base.py

Lines changed: 11 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -21,6 +21,7 @@
2121
Client,
2222
ResultSet,
2323
PingingPool,
24+
TypeCode,
2425
)
2526
from google.cloud.spanner_v1.database import Database
2627
from google.cloud.spanner_v1.instance import Instance
@@ -36,6 +37,12 @@ def add_result(sql: str, result: ResultSet):
3637

3738

3839
def add_select1_result():
40+
add_single_result("select 1", "c", TypeCode.INT64, [("1",)])
41+
42+
43+
def add_single_result(
44+
sql: str, column_name: str, type_code: spanner_type.TypeCode, row
45+
):
3946
result = result_set.ResultSet(
4047
dict(
4148
metadata=result_set.ResultSetMetadata(
@@ -45,10 +52,8 @@ def add_select1_result():
4552
fields=[
4653
spanner_type.StructType.Field(
4754
dict(
48-
name="c",
49-
type=spanner_type.Type(
50-
dict(code=spanner_type.TypeCode.INT64)
51-
),
55+
name=column_name,
56+
type=spanner_type.Type(dict(code=type_code)),
5257
)
5358
)
5459
]
@@ -58,8 +63,8 @@ def add_select1_result():
5863
),
5964
)
6065
)
61-
result.rows.extend(["1"])
62-
MockServerTestBase.spanner_service.mock_spanner.add_result("select 1", result)
66+
result.rows.extend(row)
67+
MockServerTestBase.spanner_service.mock_spanner.add_result(sql, result)
6368

6469

6570
class MockServerTestBase(fixtures.TestBase):

test/mockserver_tests/test_basics.py

Lines changed: 32 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -12,20 +12,32 @@
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
16-
from sqlalchemy import create_engine, select, MetaData, Table, Column, Integer, String
17+
from sqlalchemy import (
18+
create_engine,
19+
select,
20+
MetaData,
21+
Table,
22+
Column,
23+
Integer,
24+
String,
25+
func,
26+
)
1727
from sqlalchemy.testing import eq_, is_instance_of
1828
from google.cloud.spanner_v1 import (
1929
FixedSizePool,
2030
BatchCreateSessionsRequest,
2131
ExecuteSqlRequest,
2232
ResultSet,
2333
PingingPool,
34+
TypeCode,
2435
)
2536
from test.mockserver_tests.mock_server_test_base import (
2637
MockServerTestBase,
2738
add_select1_result,
2839
add_result,
40+
add_single_result,
2941
)
3042

3143

@@ -59,6 +71,25 @@ def test_sqlalchemy_select1(self):
5971
results = connection.execute(select(1)).fetchall()
6072
self.verify_select1(results)
6173

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

0 commit comments

Comments
 (0)