Python 类型错误:不可损坏的类型:';列表';sqlalchemy插入查询出错

Python 类型错误:不可损坏的类型:';列表';sqlalchemy插入查询出错,python,oracle,sqlalchemy,Python,Oracle,Sqlalchemy,我正在尝试通过sqlalchemy将记录插入oracle数据库,以下是我的模型: 类项目(基本): __tablename_uu='items' id=db.Column(db.Integer,db.Sequence('item\u id\u seq'),nullable=False,primary\u key=True) name=db.Column(db.String(128),null=True) 定义初始化(self,name): self.name=名称 我已经通过运行db迁移和升级

我正在尝试通过sqlalchemy将记录插入oracle数据库,以下是我的模型:

类项目(基本):
__tablename_uu='items'
id=db.Column(db.Integer,db.Sequence('item\u id\u seq'),nullable=False,primary\u key=True)
name=db.Column(db.String(128),null=True)
定义初始化(self,name):
self.name=名称
我已经通过运行db迁移和升级在db中创建了表。我试图在db表中插入一个简单的行,如中所示:

test_obj = Item(name='item-1')
db.session.add(test_obj)
db.session.commit()
但是插入失败,错误为
TypeError:unhabable type:'list'

但是,如果我将它与id(如下所示)一起插入,并且在构造函数中初始化了id,那么它将成功插入

test_obj = Item(id = 1, name='item-1')
db.session.add(test_obj)
db.session.commit()

class Item(Base):
    ...
    def __init__(self, id, name):
        self.id = id
        self.name = name

由于我已经用序列设置了id,它应该自动递增并自动插入,但这里不是这样,希望您能提供帮助。

只需将
id
标记为
主键即可

class Item(Base):
    __tablename__ = 'items'
    id = db.Column(db.Integer, primary_key=True)
    name = db.Column(db.String(128), nullable=True)

def __init__(self, name):
    self.name = name

使用sqlalchemy 1.3.6或更高版本 Sqlalchemy不支持oracle 11g的自动增量

如果您使用的是“oracle 11g”,请使用以下代码:

from sqlalchemy import event
from sqlalchemy.schema import CreateSequence, DDL

db_session = sessionmaker(bind={your database engine})
class Item(Base):
    __tablename__ = 'items'
    id = db.Column(db.Integer, nullable=False, primary_key=True)
    name = db.Column(db.String(128), nullable=True)

    def __init__(self, name):
        self.name = name

def create_trigger_for_items(*args, **kwargs):
    with con.db_session() as session:
        session.execute(CreateSequence(db.Sequence('item_id_seq')))
        session.execute(DDL("""CREATE OR REPLACE TRIGGER ITEM_ID_TRIGGER 
                BEFORE INSERT ON items
                REFERENCING NEW AS NEW
                FOR EACH ROW 
                BEGIN
                :NEW.id := item_id_seq.NEXTVAL;
                END;"""))


event.listen(Item.__table__, "after_create",
             create_trigger_for_items)
class Item(Base):
    __tablename__ = 'items'
    id = db.Column(db.Integer, db.Sequence('item_id_seq'), default=db.Sequence('item_id_seq').next_value(), primary_key=True)
    name = db.Column(db.String(128), nullable=True)

    def __init__(self, name):
        self.name = name
class Item(Base):
    __tablename__ = 'items'
    id = db.Column(db.Integer, autoincrement=True, primary_key=True)
    name = db.Column(db.String(128), nullable=True)

    def __init__(self, name):
        self.name = name
如果您使用的是“oracle 12”,请使用以下代码:

from sqlalchemy import event
from sqlalchemy.schema import CreateSequence, DDL

db_session = sessionmaker(bind={your database engine})
class Item(Base):
    __tablename__ = 'items'
    id = db.Column(db.Integer, nullable=False, primary_key=True)
    name = db.Column(db.String(128), nullable=True)

    def __init__(self, name):
        self.name = name

def create_trigger_for_items(*args, **kwargs):
    with con.db_session() as session:
        session.execute(CreateSequence(db.Sequence('item_id_seq')))
        session.execute(DDL("""CREATE OR REPLACE TRIGGER ITEM_ID_TRIGGER 
                BEFORE INSERT ON items
                REFERENCING NEW AS NEW
                FOR EACH ROW 
                BEGIN
                :NEW.id := item_id_seq.NEXTVAL;
                END;"""))


event.listen(Item.__table__, "after_create",
             create_trigger_for_items)
class Item(Base):
    __tablename__ = 'items'
    id = db.Column(db.Integer, db.Sequence('item_id_seq'), default=db.Sequence('item_id_seq').next_value(), primary_key=True)
    name = db.Column(db.String(128), nullable=True)

    def __init__(self, name):
        self.name = name
class Item(Base):
    __tablename__ = 'items'
    id = db.Column(db.Integer, autoincrement=True, primary_key=True)
    name = db.Column(db.String(128), nullable=True)

    def __init__(self, name):
        self.name = name
如果您使用的是“oracle 12c”,请使用以下代码:

from sqlalchemy import event
from sqlalchemy.schema import CreateSequence, DDL

db_session = sessionmaker(bind={your database engine})
class Item(Base):
    __tablename__ = 'items'
    id = db.Column(db.Integer, nullable=False, primary_key=True)
    name = db.Column(db.String(128), nullable=True)

    def __init__(self, name):
        self.name = name

def create_trigger_for_items(*args, **kwargs):
    with con.db_session() as session:
        session.execute(CreateSequence(db.Sequence('item_id_seq')))
        session.execute(DDL("""CREATE OR REPLACE TRIGGER ITEM_ID_TRIGGER 
                BEFORE INSERT ON items
                REFERENCING NEW AS NEW
                FOR EACH ROW 
                BEGIN
                :NEW.id := item_id_seq.NEXTVAL;
                END;"""))


event.listen(Item.__table__, "after_create",
             create_trigger_for_items)
class Item(Base):
    __tablename__ = 'items'
    id = db.Column(db.Integer, db.Sequence('item_id_seq'), default=db.Sequence('item_id_seq').next_value(), primary_key=True)
    name = db.Column(db.String(128), nullable=True)

    def __init__(self, name):
        self.name = name
class Item(Base):
    __tablename__ = 'items'
    id = db.Column(db.Integer, autoincrement=True, primary_key=True)
    name = db.Column(db.String(128), nullable=True)

    def __init__(self, name):
        self.name = name
然后您可以使用:

test_obj = Item(name='item-1')
db.session.add(test_obj)
db.session.commit()

谢谢,我已经试过了,但是仍然不起作用,我已经更新了这个问题以及主键字段。它一定是你发布的代码之外的内容。你能用更多的信息更新你的问题吗?可能是完整的堆栈跟踪。这可能是因为:,我正在尝试降级cx OracleI的版本。我正在使用Oracle,我已经更新了问题,我在一个缺陷中提到了它。