Диалект «оракул» с текущими настройками версии базы данных не поддерживает пустые вставки - PullRequest
0 голосов
/ 10 ноября 2018

Кто-нибудь знает, что означает эта ошибка? Ниже приведен метод класса, который возвращает ошибку sqlalchemy.exc.CompileError: Диалект «оракул» с текущими настройками версии базы данных не поддерживает пустые вставки.

Я использую тот же метод класса в sqlserver, и он работает. как обойти это в оракуле с помощью sqlalchemy orm?

def insertr(self, tablename, data, schema=None):
    def convert_nan(v):
        if pd.isnull(v) or pd.isna(v):
            v = None
        return v

    class DbTable(object):
        pass

    engine = self.engine
    metadata = MetaData(bind=engine)
    table = Table(tablename, metadata, autoload=True, quote=True, schema=schema)
    mapper(DbTable, table)
    DbTable.__getattribute__(DbTable, self.primary_key)

    insert_rows = [{k: convert_nan(v) for k, v in check_ir.items()} for check_ir in data]
    session = sessionmaker(bind=engine)()
    session.bulk_insert_mappings(DbTable, insert_rows)

    session.commit()
    session.flush()

и данные, которые я пытаюсь вставить, выглядят так:

[{'coll': 10, 'col2': 'value'}, {'col1': 20, 'col2': 'value'}]

Ответы [ 2 ]

0 голосов
/ 18 июля 2019

Ниже приведен контрольный список для устранения той же ошибки:

  1. Проверьте, совпадают ли column names и dictionary keys (необходимо вставить) (регистр учитывается)
  2. Некоторые database objects, такие как триггер, процедура пытается вставить значение в столбец, который не существует.
  3. Попытка вставить значение none для столбца NUN-NULL
0 голосов
/ 12 ноября 2018

Я нашел обходной путь для этой проблемы, поэтому, если кто-то столкнется с такой же проблемой, вот код:

def insertr(self, tablename, data, schema=None):
    def convert_nan(v):
        if pd.isnull(v) or pd.isna(v):
            v = None
        return v

    engine = self.engine
    metadata = MetaData(bind=engine)
    table = Table(tablename, metadata, autoload=True, quote=True, schema=schema)
    insert_rows = [{k.lower(): convert_nan(v) for k, v in check_ir.items()} for check_ir in data]
    with engine.begin() as connection:
        for insert_row in insert_rows:
            connection.execute(table.insert().values(**insert_row))
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...