-
Notifications
You must be signed in to change notification settings - Fork 24
New issue
Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.
By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.
Already on GitHub? Sign in to your account
How to set default value to a dataclass field? #58
Comments
I made a working around to continue to use the sqlc on python:
sed -i '/^[[:space:]]*[a-zA-Z0-9_]*:[[:space:]]*Optional/ s/\(Optional\[\([^]]*\)\]\)/\1 = None/' models.py
import re
import logging
import sys
logging.basicConfig(level=logging.DEBUG, format='%(asctime)s - %(levelname)s - %(message)s')
def main(filename: str):
with open(filename, "r") as file:
contents = file.read().split("\n")
dataclass_line=-1
class_line=-1
inner_class_indent=''
field_map={}
for idx, line in enumerate(contents):
if re.match(r"\@dataclasses.dataclass\(\)", line):
dataclass_line = idx
logging.debug(f"Found dataclass line: {dataclass_line}")
continue
if dataclass_line >= 0:
if re.match(r"class ", line):
class_line = idx
logging.debug(f"Found class line: {class_line}")
continue
if class_line >= 0:
if inner_class_indent == '':
inner_class_indent = re.match(r"^(\s+)", line).group(1)
if re.match("^"+inner_class_indent+r"[\S|\n]", line):
if re.match(r"\s+[a-z]+[a-z_0-9]*\s*:\s*", line):
logging.debug(f"Found field line: {line}")
field_map[idx] = line
else:
if field_map.keys():
resort_fields(class_line, idx, contents, field_map)
class_line = -1
dataclass_line = -1
inner_class_indent = ''
field_map = {}
with open(filename, 'w') as file:
file.write("\n".join(contents))
def resort_fields(class_line, end_line, contents, field_map):
logging.info(f"Resorting fields from: {contents[class_line]}")
def sort(kv):
k = kv[1]
if "Optional" in k and " = " in k:
return "Z"+k
if " = " in k:
return "Y"+k
if " = None" in k:
return "X"+k
else:
return "W"+k
sorted_fields = sorted(field_map.items(), key=sort)
logging.debug("BEFORE:")
for line in contents[class_line:end_line]:
logging.debug(line)
original_idxs = field_map.keys()
sorted_idxs = [ s[0] for s in sorted_fields]
tuples = list(zip(original_idxs, sorted_idxs))
logging.debug("DE->PARA:")
for o,d in tuples:
logging.debug(f"{field_map.get(o)}{o} -> {field_map.get(d)}{d}")
contents[o] = field_map.get(d)
logging.info("AFTER:")
for line in contents[class_line:end_line]:
logging.info(line)
if __name__ == "__main__":
if len(sys.argv) != 2:
logging.error("Usage: my_script <file_to_modify.py>")
sys.exit(1)
filename = sys.argv[1]
main(filename) python -W all scripts/resort_dataclass_optional_fields.py models.py You will need to do this on models and queries. |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment
I want to set a None value in Optional dataclass fields. But I was unable to find how to do it in documentation. This is possible?
I have a table like:
running
sqlc generate
I got:But what I really wants is a default None value in description, like:
I'm using sqlc v1.27.0 (by docker) and generating python code for postgres with the config:
The text was updated successfully, but these errors were encountered: