Utworzę model za pomocą declarative_base() w SQL Alchemy, jak pokazano poniżej.

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)

Następnie migrowałem ten sam model do bazy danych Snowflake.

enter image description here

Model ma pole id, który jest zadeklarowany jako primary_key=True i autoincrement=True. Kiedy próbuję włożyć dane do tabeli schema_on_instance za pomocą konsoli Snowflake. Muszę dostarczyć id lub nie będzie włożeniu danych i zwróci błąd.

Zapytanie (wykonywane pomyślnie, gdzie jest dostarczone 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);

zapytanie (wykonywane pomyślnie, gdy całkowicie zignorowałem kolumnę 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);

Zapytanie (Wykonanie nie powiodło się, gdzie id jest dostarczany jako 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);

I zwrócił błąd -

NULL result in a non-nullable column

Zadaniem ta metody jest włożenie danych w powyższej tabeli bazy danych.

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)

Błąd od 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}]

Jeśli spojrzymy na zapytanie utworzone w błędzie zwróconej przez SQLalchemy, rozważał kolumnę id i jego wartość jest interpretowana jako None. Jak mogę utworzyć zapytanie bez włączenia kolumny id i jego wartość.

Moim celem końcowym jest wstawanie danych do tabeli bazy danych Snowflake za pomocą SQLalchemy. Chcę stół bazy danych Snowflake do automatycznego przyrostu wartości id.

Jak pozbyć się tego błędu.

1
Jeet Patel 23 listopad 2020, 11:08

1 odpowiedź

Najlepsza odpowiedź

Myślę, że potrzebujesz włączenia sekwencji podczas definiowania tabeli, aby uzyskać do pracy: Zachowanie automatycznego przyrostu sqlalchemy

Sekwencja jest samodzielnym obiektem w płatku śniegu, które należy utworzyć przed utworzeniem tabeli, a następnie odwołuje się do oświadczenia Utwórz tabelę: Utwórz sekwencję

1
NickW 23 listopad 2020, 10:49