Python 类型错误:不可损坏的类型:';列表';sqlalchemy插入查询出错
我正在尝试通过sqlalchemy将记录插入oracle数据库,以下是我的模型: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迁移和升级
类项目(基本):
__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,我已经更新了问题,我在一个缺陷中提到了它。