当前位置: 首页 > 知识库问答 >
问题:

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

颛孙英才
2023-03-14

我创建了一个模型使用declarative_base()在sql炼金术如下所示。

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)

然后我将同一个模型移植到Snowflake数据库

该模型有一个字段id,声明为primary_key=True自动增量=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为空)-

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,其值被解释为。如何在不包括列id及其值的情况下形成查询。

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

我该如何消除这个错误。

共有1个答案

郭兴文
2023-03-14

我认为您需要在定义表时包含一个序列,以使其工作:SQLAlChemy自动增量行为

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

 类似资料:
  • 本文向大家介绍Android 将数据插入数据库,包括了Android 将数据插入数据库的使用技巧和注意事项,需要的朋友参考一下 示例            

  • 问题内容: 我使用Google Maps API制作了一个非常简单的页面,其中有几个字段,用户将在其中放置一些数据。看起来像- http://aiworker2.usask.ca/marker_field_db.html 我要做的是使用javascript / Ajax将数据存储到MySQL数据库中。我发现了几个使用Jquery的示例。我是这个javascript / Ajax / Jquery平

  • 我有一个postgres数据库,包含一个名为“users”的表。该表有四个字段: id BIGSERIAL主键 显示名称文本不为空, 电子邮件文本不为空 电话号码文本 我想从dart代码中添加数据。我的尝试是这样的: 问题是我遇到了一个例外 (PostgreSQLSeverity.error 42601:在“display_name”处或附近出现语法错误)

  • 事情是这样的 我不知道发生了什么,如果有人能帮忙,我会非常感激的。THX!

  • 问题内容: 我想使用PreparedStatement将行插入表中。该表有3列(int,String,String)。关键是int列是AUTO_INCREMENT,所以我想将该变量保留为空,然后让数据库完成该工作(这是一个id)。还没有找到如何做! 这是一个MySQL数据库。 问题答案: 这是相对简单的,只需从列列表中删除自动增量列即可: 准备该语句,设置两个参数,然后在非查询模式下执行。