63 lines
1.5 KiB
Python
63 lines
1.5 KiB
Python
duckdb_ddl_tmpl = """{% macro typeStr(type,len,dec) %}
|
|
{%- if type in ['str', 'char'] -%}
|
|
VARCHAR({{len}})
|
|
{%- elif type in ['short', 'int'] -%}
|
|
INTEGER
|
|
{%- elif type == 'long' -%}
|
|
BIGINT
|
|
{%- elif type in ['float', 'double', 'ddouble'] -%}
|
|
DOUBLE
|
|
{%- elif type == 'date' -%}
|
|
DATE
|
|
{%- elif type == 'time' -%}
|
|
TIME
|
|
{%- elif type in ['datetime', 'timestamp'] -%}
|
|
TIMESTAMP
|
|
{%- elif type == 'text' -%}
|
|
VARCHAR
|
|
{%- elif type == 'bin' -%}
|
|
BLOB
|
|
{%- else -%}
|
|
{{type | upper}}
|
|
{%- endif %}
|
|
{%- endmacro %}
|
|
|
|
{%- macro defaultValue(defaultv) %}
|
|
{%- if defaultv %} DEFAULT '{{defaultv}}'{%- endif -%}
|
|
{%- endmacro %}
|
|
|
|
{% macro nullStr(nullable) %}
|
|
{%- if nullable=='no' -%}
|
|
NOT NULL
|
|
{%- endif -%}
|
|
{% endmacro %}
|
|
|
|
{% macro primary() %}
|
|
, PRIMARY KEY({{ ','.join(summary[0].primary) }})
|
|
{% endmacro %}
|
|
|
|
-- Drop table if exists
|
|
DROP TABLE IF EXISTS {{summary[0].name}};
|
|
|
|
-- Create table
|
|
CREATE TABLE {{summary[0].name}} (
|
|
{% for field in fields %}
|
|
"{{field.name}}" {{typeStr(field.type,field.length,field.dec)}} {{nullStr(field.nullable)}} {{defaultValue(field.default)}}{% if not loop.last %},{% endif %}
|
|
{% endfor %}
|
|
{% if summary[0].primary and len(summary[0].primary)>0 %}
|
|
{{primary()}}
|
|
{% endif %}
|
|
);
|
|
|
|
-- Table comment (DuckDB 不支持 COMMENT 语法)
|
|
{% if summary[0].title %}
|
|
-- COMMENT: {{summary[0].title}}
|
|
{% endif %}
|
|
|
|
-- DuckDB 当前版本不支持 CREATE INDEX 语法,以下保留作兼容注释
|
|
{% for v in indexes %}
|
|
-- INDEX {{summary[0].name}}_{{v.name}} ON {{summary[0].name}}({{ ",".join(v.idxfields) }});
|
|
{% endfor %}
|
|
"""
|
|
|