【问题标题】:Parse DEFAULT parameter of a ddl statement using ddlparse使用 ddlparse 解析 ddl 语句的 DEFAULT 参数
【发布时间】:2020-04-20 07:08:22
【问题描述】:

我正在尝试使用 ddlparse 解析 ddl 语句。我能够解析除默认参数以外的每个字段。我按照下面的链接。 https://github.com/shinichi-takii/ddlparse

下面是我要解析的 ddl。

sample_ddl = """
CREATE TABLE My_Schema.Sample_Table (
  Id integer PRIMARY KEY ,
  Name varchar(100) NOT NULL DEFAULT 'BASANT',
  Total bigint NOT NULL DEFAULT 1 ,
  Avg decimal(5,1) NOT NULL,
  Created_At date, -- Oracle 'DATE' -> BigQuery 'DATETIME'
  UNIQUE (NAME)
);
"""

我可以使用以下代码提取除 DEFAULT 参数之外的所有信息:

for col in table.columns.values():
    col_info = []
    col_info.append("name = {}".format(col.name))
    col_info.append("data_type = {}".format(col.data_type))
    col_info.append("length = {}".format(col.length))
    col_info.append("precision(=length) = {}".format(col.precision))
    col_info.append("scale = {}".format(col.scale))
    col_info.append("constraint = {}".format(col.constraint))
    col_info.append("not_null = {}".format(col.not_null))
    col_info.append("PK = {}".format(col.primary_key))
    col_info.append("unique = {}".format(col.unique))
    col_info.append("bq_legacy_data_type = {}".format(col.bigquery_legacy_data_type))
    col_info.append("bq_standard_data_type = {}".format(col.bigquery_standard_data_type))
    col_info.append("comment = '{}'".format(col.comment))
    col_info.append("description(=comment) = '{}'".format(col.description))
    col_info.append("BQ {}".format(col.to_bigquery_field()))
    print(" : ".join(col_info))

谁能帮助我如何获取默认参数的值?

【问题讨论】:

    标签: python sql-server python-3.x python-2.7


    【解决方案1】:

    增加了在ddlparsev1.7.0中获取默认属性的支持。

    for col in table.columns.values():
        col_info = {}
    
        col_info["default"] = col.default
    
        print(json.dumps(col_info, indent=2, ensure_ascii=False))
    

    【讨论】:

      【解决方案2】:

      PRIMARY KEY 的默认约束没有多大意义。在SQL Server 的上下文中,您可以创建以下默认约束,但它不起作用:

      DROP TABLE IF EXISTS dbo.Sample_Table
      
      CREATE TABLE dbo.Sample_Table (
        Id integer PRIMARY KEY DEFAULT 'BASANT',
        Name varchar(100) NOT NULL, --COMMENT 'User name',
      
      );
      
      INSERT INTO dbo.Sample_Table (Name)
      VALUES ('x')
      

      Msg 245, Level 16, State 1, Line 9 转换时转换失败 将 varchar 值 'BASANT' 转换为数据类型 int。

      为什么?因为您不能将默认值string 设置为整数列。

      如果你说它是数字,那么事件:

      DROP TABLE IF EXISTS dbo.Sample_Table
      
      CREATE TABLE dbo.Sample_Table (
        Id integer PRIMARY KEY DEFAULT 1,
        Name varchar(100) NOT NULL, --COMMENT 'User name',
      
      );
      
      INSERT INTO dbo.Sample_Table (Name)
      VALUES ('x');
      
      INSERT INTO dbo.Sample_Table (Name)
      VALUES ('x');
      

      它只会在第一次工作,第二次你会得到:

      消息 2627,级别 14,状态 1,第 23 行违反主键 约束“PK__Sample_T__3214EC0759729E5E”。不能插入重复 键入对象“dbo.Sample_Table”。重复键值为 (1)。

      因为主键值必须是唯一的。您可能正在寻找这样的东西:

      ID INTEGER PRIMARY KEY IDENTITY(1,1)
      

      【讨论】:

      • 对不起,这个例子是错误的。让我们看下面的例子。
      • sample_ddl = """ CREATE TABLE My_Schema.Sample_Table (Id integer PRIMARY KEY, Name varchar(100) NOT NULL DEFAULT 'Basant', Total bigint NOT NULL DEFAULT 1, Avg decimal(5,1) NOT NULL, Created_At date, -- Oracle 'DATE' -> BigQuery 'DATETIME' UNIQUE (NAME) );
      • 实际上我正在尝试从创建表 ddl 中编写一个“更改表添加列”命令。这些是现有的表。如果有人想在现有表中添加新列,他们会给我创建表 ddl。从这个创建表 ddl,我找出新列并创建一个 ALTER TABLE ADD COLUMN ddl
      猜你喜欢
      • 1970-01-01
      • 2011-01-02
      • 2018-09-15
      • 2018-03-21
      • 1970-01-01
      • 2016-11-08
      • 1970-01-01
      • 1970-01-01
      • 2021-12-10
      相关资源
      最近更新 更多