Skip to content

Commit fffd8aa

Browse files
authored
fix: remove unused 'charset' in generate schema encoders (#1817)
* fix: remove unused 'charset' in generate schema encoders * fix: update testcases for generate schema array fields * fix: remove extra spaces when generate schema * fix(schema-generator): use {} wrap in default value for postgres array field * fix(sqlite): set support_update_limit_order_by=False because sqlite does not support it
1 parent be5bbc1 commit fffd8aa

File tree

10 files changed

+153
-96
lines changed

10 files changed

+153
-96
lines changed

.gitignore

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -107,3 +107,5 @@ ENV/
107107
# MyPy caches
108108
.mypy_cache/
109109

110+
# macos
111+
.DS_Store
Lines changed: 17 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,17 @@
1+
from tortoise import Model
2+
from tortoise.contrib.postgres.fields import TSVectorField, ArrayField
3+
4+
5+
class PostgresFields(Model):
6+
tsvector = TSVectorField()
7+
text_array = ArrayField(element_type="text", default=["a", "b", "c"])
8+
varchar_array = ArrayField(element_type="varchar(32)", default=["aa", "bbb", "cccc"])
9+
int_array = ArrayField(element_type="int", default=[1, 2, 3], null=True)
10+
real_array = ArrayField(
11+
element_type="real",
12+
default=[1.1, 2.2, 3.3],
13+
description="this is array of real numbers",
14+
)
15+
16+
class Meta:
17+
table = "postgres_fields"

tests/schema/test_generate_schema.py

Lines changed: 106 additions & 74 deletions
Large diffs are not rendered by default.

tortoise/backends/base/schema_generator.py

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -22,7 +22,7 @@
2222
class BaseSchemaGenerator:
2323
DIALECT = "sql"
2424
TABLE_CREATE_TEMPLATE = 'CREATE TABLE {exists}"{table_name}" ({fields}){extra}{comment};'
25-
FIELD_TEMPLATE = '"{name}" {type} {nullable} {unique}{primary}{default}{comment}'
25+
FIELD_TEMPLATE = '"{name}" {type}{nullable}{unique}{primary}{default}{comment}'
2626
INDEX_CREATE_TEMPLATE = 'CREATE INDEX {exists}"{index_name}" ON "{table_name}" ({fields});'
2727
UNIQUE_INDEX_CREATE_TEMPLATE = INDEX_CREATE_TEMPLATE.replace(" INDEX", " UNIQUE INDEX")
2828
UNIQUE_CONSTRAINT_CREATE_TEMPLATE = 'CONSTRAINT "{index_name}" UNIQUE ({fields})'
@@ -251,8 +251,8 @@ def _get_table_sql(self, model: "Type[Model]", safe: bool = True) -> dict:
251251
)
252252
continue
253253

254-
nullable = "NOT NULL" if not field_object.null else ""
255-
unique = "UNIQUE" if field_object.unique else ""
254+
nullable = " NOT NULL" if not field_object.null else ""
255+
unique = " UNIQUE" if field_object.unique else ""
256256

257257
if getattr(field_object, "reference", None):
258258
reference = cast("ForeignKeyFieldInstance", field_object.reference)

tortoise/backends/mssql/schema_generator.py

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -11,7 +11,7 @@
1111
class MSSQLSchemaGenerator(BaseSchemaGenerator):
1212
DIALECT = "mssql"
1313
TABLE_CREATE_TEMPLATE = "CREATE TABLE [{table_name}] ({fields}){extra};"
14-
FIELD_TEMPLATE = "[{name}] {type} {nullable} {unique}{primary}{default}"
14+
FIELD_TEMPLATE = "[{name}] {type}{nullable}{unique}{primary}{default}"
1515
INDEX_CREATE_TEMPLATE = "CREATE INDEX [{index_name}] ON [{table_name}] ({fields});"
1616
GENERATED_PK_TEMPLATE = "[{field_name}] {generated_sql}"
1717
FK_TEMPLATE = (

tortoise/backends/mysql/schema_generator.py

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -14,7 +14,7 @@ class MySQLSchemaGenerator(BaseSchemaGenerator):
1414
INDEX_CREATE_TEMPLATE = "KEY `{index_name}` ({fields})"
1515
UNIQUE_CONSTRAINT_CREATE_TEMPLATE = "UNIQUE KEY `{index_name}` ({fields})"
1616
UNIQUE_INDEX_CREATE_TEMPLATE = UNIQUE_CONSTRAINT_CREATE_TEMPLATE
17-
FIELD_TEMPLATE = "`{name}` {type} {nullable} {unique}{primary}{comment}{default}"
17+
FIELD_TEMPLATE = "`{name}` {type}{nullable}{unique}{primary}{comment}{default}"
1818
GENERATED_PK_TEMPLATE = "`{field_name}` {generated_sql}{comment}"
1919
FK_TEMPLATE = (
2020
"{constraint}FOREIGN KEY (`{db_column}`)"

tortoise/backends/oracle/schema_generator.py

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -12,7 +12,7 @@
1212
class OracleSchemaGenerator(BaseSchemaGenerator):
1313
DIALECT = "oracle"
1414
TABLE_CREATE_TEMPLATE = 'CREATE TABLE "{table_name}" ({fields}){extra};'
15-
FIELD_TEMPLATE = '"{name}" {type}{default} {nullable} {unique}{primary}'
15+
FIELD_TEMPLATE = '"{name}" {type}{default}{nullable}{unique}{primary}'
1616
TABLE_COMMENT_TEMPLATE = "COMMENT ON TABLE \"{table}\" IS '{comment}';"
1717
COLUMN_COMMENT_TEMPLATE = 'COMMENT ON COLUMN "{table}"."{column}" IS \'{comment}\';'
1818
INDEX_CREATE_TEMPLATE = 'CREATE INDEX "{index_name}" ON "{table_name}" ({fields});'

tortoise/backends/sqlite/client.py

Lines changed: 6 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -61,7 +61,12 @@ class SqliteClient(BaseDBAsyncClient):
6161
query_class = SQLLiteQuery
6262
schema_generator = SqliteSchemaGenerator
6363
capabilities = Capabilities(
64-
"sqlite", daemon=False, requires_limit=True, inline_comment=True, support_for_update=False
64+
"sqlite",
65+
daemon=False,
66+
requires_limit=True,
67+
inline_comment=True,
68+
support_for_update=False,
69+
support_update_limit_order_by=False,
6570
)
6671

6772
def __init__(self, file_path: str, **kwargs: Any) -> None:

tortoise/contrib/postgres/fields.py

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -10,7 +10,7 @@ class TSVectorField(Field):
1010
class ArrayField(Field, list): # type: ignore
1111
def __init__(self, element_type: str = "int", **kwargs: Any):
1212
super().__init__(**kwargs)
13-
self.element_type = element_type
13+
self.element_type = element_type.upper()
1414

1515
@property
1616
def SQL_TYPE(self) -> str: # type: ignore

tortoise/converters.py

Lines changed: 15 additions & 14 deletions
Original file line numberDiff line numberDiff line change
@@ -25,43 +25,44 @@ def _escape_unicode(value: str, mapping=None) -> str:
2525
escape_string = _escape_unicode
2626

2727

28-
def escape_item(val: Any, charset, mapping=None) -> str:
28+
def escape_item(val: Any, mapping=None) -> str:
29+
if isinstance(val, str):
30+
return f'"{val}"'
31+
2932
if mapping is None:
3033
mapping = encoders
34+
3135
encoder = mapping.get(type(val))
3236

3337
# Fallback to default when no encoder found
3438
if not encoder:
3539
try:
3640
encoder = mapping[str]
37-
except KeyError:
38-
raise TypeError("no default type converter defined")
41+
except KeyError as exc:
42+
raise TypeError("no default type converter defined") from exc
3943

40-
if encoder in (escape_dict, escape_sequence):
41-
val = encoder(val, charset, mapping)
42-
else:
43-
val = encoder(val, mapping)
44+
val = encoder(val, mapping)
4445
return val
4546

4647

47-
def escape_dict(val: Dict, charset, mapping=None) -> dict:
48+
def escape_dict(val: Dict, mapping=None) -> dict:
4849
n = {}
4950
for k, v in val.items():
50-
quoted = escape_item(v, charset, mapping)
51+
quoted = escape_item(v, mapping)
5152
n[k] = quoted
5253
return n
5354

5455

55-
def escape_sequence(val: Sequence, charset, mapping=None) -> str:
56+
def escape_sequence(val: Sequence, mapping=None) -> str:
5657
n = []
5758
for item in val:
58-
quoted = escape_item(item, charset, mapping)
59+
quoted = escape_item(item, mapping)
5960
n.append(quoted)
60-
return "(" + ",".join(n) + ")"
61+
return "'{" + ",".join(n) + "}'"
6162

6263

63-
def escape_set(val: Set, charset, mapping=None) -> str:
64-
return ",".join([escape_item(x, charset, mapping) for x in val])
64+
def escape_set(val: Set, mapping=None) -> str:
65+
return ",".join([escape_item(x, mapping) for x in val])
6566

6667

6768
def escape_bool(value: bool, mapping=None) -> str:

0 commit comments

Comments
 (0)