尝试使用 SQLAlchemy 将数据插入雪花数据库表

Posted

技术标签:

【中文标题】尝试使用 SQLAlchemy 将数据插入雪花数据库表【英文标题】:Trying to insert data into Snowflake database table using SQLAlchemy 【发布时间】:2020-11-23 08:08:27 【问题描述】:

我在 sql alchemy 中使用declarative_base() 创建了一个模型,如下所示。

class SchemaOnInstance(Base):

    __tablename__ = 'schema_on_instance'
    __table_args__ = 
        'extend_existing' : True,
        'schema' : 'SFOPT_TEST_SCHEMA'
    

    id = Column(Integer, primary_key=True, autoincrement=True)
    created_on = Column(Time, nullable=True)
    name = Column(String(100), nullable=True)
    is_default = Column(String(50), nullable=True)
    is_current = Column(String(50), nullable=True)
    database_name = Column(String(200), nullable=True)
    owner = Column(String(100), nullable=True)
    comment = Column(Text, nullable=True)
    options = Column(String(100), nullable=True)
    retention_time = Column(Integer, nullable=True)
    instance_id = Column(Integer, nullable=True)

    def __repr__(self):
        return "<SchemaOnInstance()>".format(self.id)

然后我将相同的模型迁移到雪花数据库。

模型有一个字段id,声明为primary_key=Trueautoincrement=True。当我尝试使用雪花控制台将数据插入表schema_on_instance 时。我必须提供id,否则它不会插入数据并返回错误。

查询(执行成功,其中提供了id)-

INSERT INTO "SFOPT_TEST_SCHEMA".schema_on_instance (id, created_on, name, is_default, is_current, database_name, owner, comment, options, retention_time, instance_id)
VALUES (1, Null, 'Some Name', 'N', 'N', 'DEMO_DB', Null, 'Some comment', Null, 1, 1);

查询(当我完全忽略列id时执行成功)-

INSERT INTO "SFOPT_TEST_SCHEMA".schema_on_instance (created_on, name, is_default, is_current, database_name, owner, comment, options, retention_time, instance_id)
VALUES (Null, 'Some Name', 'N', 'N', 'DEMO_DB', Null, 'Some comment', Null, 1, 1);

查询(执行失败,id 提供为 Null)-

INSERT INTO "SFOPT_TEST_SCHEMA".schema_on_instance (id, created_on, name, is_default, is_current, database_name, owner, comment, options, retention_time, instance_id)
VALUES (Null, Null, 'Some Name', 'N', 'N', 'DEMO_DB', Null, 'Some comment', Null, 1, 1);

它返回了一个错误 -

NULL result in a non-nullable column

此方法的作用是将数据插入上述数据库表中。

def dump_schema(self):

    session = self.Session()
            
    schema_obj = []

    for each_schema in self.schema:

        schema_obj.append(SchemaOnInstance(created_on=each_schema[0], name=each_schema[1], is_default=each_schema[2], is_current=each_schema[3], database_name=each_schema[4], owner=each_schema[5], comment=each_schema[6], options=each_schema[7], retention_time=each_schema[8], instance_id=each_schema[9]))

    session.add_all(schema_obj)

    try:

        x = session.commit()
    
    except Exception as identifier:
    
        logging.error(identifier)

来自 SQLAlchemy 的错误 -

2020-11-23 08:01:02,215 :: ERROR :: dump_schema :: 95 :: (snowflake.connector.errors.ProgrammingError) 100072 (22000): 01987501-0b18-b6aa-0000-d5e500083d26: NULL result in a non-nullable column
[SQL: INSERT INTO "SFOPT_TEST_SCHEMA".schema_on_instance (id, created_on, name, is_default, is_current, database_name, owner, comment, options, retention_time, instance_id) VALUES (%(id)s, %(created_on)s, %(name)s, %(is_default)s, %(is_current)s, %(database_name)s, %(owner)s, %(comment)s, %(options)s, %(retention_time)s, %(instance_id)s)]
[parameters: 'id': None, 'created_on': datetime.datetime(2020, 11, 23, 0, 0, 58, 29000, tzinfo=<DstTzInfo 'America/Los_Angeles' PST-1 day, 16:00:00 STD>), 'name': 'INFORMATION_SCHEMA', 'is_default': 'N', 'is_current': 'N', 'database_name': 'DEMO_DB', 'owner': '', 'comment': 'Views describing the contents of schemas in this database', 'options': '', 'retention_time': '1', 'instance_id': 1]

如果我们查看 SQLAlchemy 返回的错误中形成的查询,它考虑了列 id,其值被解释为 None。如何在不包含 id 列及其值的情况下形成查询。

我的最终目标是使用 SQLAlchemy 将数据插入到雪花数据库表中。我希望 Snowflake 数据库表自动增加 id 的值。

我应该如何摆脱这个错误。

【问题讨论】:

【参考方案1】:

我认为您需要在定义表格时包含一个序列才能使其正常工作:SQLAlchemy Auto-increment Behavior

Sequence 是 Snowflake 中的一个独立对象,需要在创建表之前创建,然后在 CREATE TABLE 语句中引用:CREATE SEQUENCE

【讨论】:

我可以从哪里导入序列。它说序列未定义。

以上是关于尝试使用 SQLAlchemy 将数据插入雪花数据库表的主要内容,如果未能解决你的问题,请参考以下文章

Snowflake&SQLAlchemy“意外的'UNIQUE'

使用 JDBC 将数据插入雪花

雪花 CDC 从 S3 到雪花

使用 sqlalchemy 连接到 mssql 数据库时遇到问题

雪花表中json数据的解析字段将多行插入到新的雪花表中

如何使用 SQLAlchemy 插入数据