Skip to content

Commit 57e7d4c

Browse files
test: add escape for keys when serialize (#202)
1 parent 42620f3 commit 57e7d4c

3 files changed

Lines changed: 34 additions & 6 deletions

File tree

CHANGELOG.md

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -6,6 +6,7 @@
66

77
1. [#198](https://github.com/InfluxCommunity/influxdb3-python/pull/198): Support custom tag order via `tag_order` write option.
88
See [Sort tags by priority](https://docs.influxdata.com/influxdb3/enterprise/write-data/best-practices/schema-design/#sort-tags-by-query-priority) for more.
9+
1. [#202](https://github.com/InfluxCommunity/influxdb3-python/pull/202): Add escape for field keys when serializing to line protocol in `PolarsDataframeSerializer`.
910

1011
## 0.18.0 [2026-02-19]
1112

influxdb_client_3/write_client/client/write/polars_dataframe_serializer.py

Lines changed: 9 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -92,12 +92,15 @@ def to_line_protocol(self, row):
9292
# add escape symbols for special characters to tags
9393

9494
fields = ",".join(
95-
f"{col}=\"{self.escape_value(row[self.column_indices[col]])}\"" if isinstance(row[self.column_indices[col]],
96-
str)
97-
else f"{col}={str(row[self.column_indices[col]]).lower()}" if isinstance(row[self.column_indices[col]],
98-
bool) # Check for bool first
99-
else f"{col}={row[self.column_indices[col]]}i" if isinstance(row[self.column_indices[col]], int)
100-
else f"{col}={row[self.column_indices[col]]}"
95+
f"{self.escape_key(col)}=\"{self.escape_value(row[self.column_indices[col]])}\"" if isinstance(
96+
row[self.column_indices[col]],
97+
str)
98+
else f"{self.escape_key(col)}={str(row[self.column_indices[col]]).lower()}" if isinstance(
99+
row[self.column_indices[col]],
100+
bool) # Check for bool first
101+
else f"{self.escape_key(col)}={row[self.column_indices[col]]}i" if isinstance(row[self.column_indices[col]],
102+
int)
103+
else f"{self.escape_key(col)}={row[self.column_indices[col]]}"
101104
for col in self.column_indices
102105
if col not in self.tag_columns + [self.timestamp_column] and
103106
row[self.column_indices[col]] is not None and row[self.column_indices[col]] != ""

tests/test_polars.py

Lines changed: 24 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -123,6 +123,30 @@ def test_to_list_of_points_with_precision_variants(self):
123123
data_frame_measurement_name='iot-devices',
124124
data_frame_timestamp_column='time')
125125

126+
def test_escape_for_key(self):
127+
import polars as pl
128+
ps = PointSettings(tag="prod")
129+
df = pl.DataFrame(data={
130+
"name whitespace": ['iot-devices'],
131+
"tag1 whitespace": "something",
132+
"building": ['5a'],
133+
"temperature": [72.3],
134+
"time": pl.Series(["2022-10-01T12:01:00Z"]).str.to_datetime(time_unit='ns')
135+
})
136+
137+
actual = polars_data_frame_to_list_of_points(
138+
data_frame=df, point_settings=ps,
139+
data_frame_measurement_name='iot-devices',
140+
data_frame_tag_columns=['building', 'tag1 whitespace'],
141+
data_frame_timestamp_column='time',
142+
)
143+
144+
expected = [
145+
'iot-devices,building=5a,tag1\\ whitespace=something,tag=prod name\\ whitespace="iot-devices",'
146+
'temperature=72.3 1664625660000000000'
147+
]
148+
self.assertEqual(expected, actual)
149+
126150

127151
@unittest.skipIf(importlib.util.find_spec("polars") is None, 'Polars package not installed')
128152
class TestWritePolars(unittest.TestCase):

0 commit comments

Comments
 (0)