具有当前数据库版本设置的“ oracle”方言不支持空插入

时间:2018-11-10 16:01:01

标签: python-3.x oracle sqlalchemy

有人知道这个错误是什么意思吗?下面是返回错误sqlalchemy.exc.CompileError的类方法:具有当前数据库版本设置的'oracle'方言不支持空插入。

我在sqlserver中使用相同的类方法,并且可以工作。如何使用sqlalchemy orm在oracle中绕过它?

PasteSpecial

和我尝试插入的数据如下:

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()

2 个答案:

答案 0 :(得分:1)

我找到了解决此问题的方法,因此,如果有人在这里遇到同样的问题,则代码如下:

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))

答案 1 :(得分:0)

下面的清单解决了同样的错误:

  1. 检查column namesdictionary keys(要插入的字典)是否匹配(区分大小写)
  2. 有些database objects像触发器一样,过程正在尝试在不存在的列中插入值。
  3. 尝试为NUN-NULL列插入无值