首先,一些背景和问题描述:
我必须使用Oracle DB,并且需要使用DBAL(SQLAlchemy)进行介绍。我用于BDD / CI等的本地开发数据库使用MySQL,因此需要DBAL。一切都是用Python开发的。
连接,阅读操作不是问题,但是由于两个以上的问题(顺序和日期),我无法插入任何内容。 只是为了阐明我的要求:
'ABC'||TEST_SEQUENCE.NEXTVAL
设置为默认值即可解决。这在数据库级别上有效。我不知道如何使其工作并使用字符串前缀。2019-01-01 12:02:03
)感到满意,因此Oracle很气质。我使用过datetime对象,但是它会以datetime.datetime(2013, 1, 1, 12, 2, 3)
作为日期值生成sql,这对于Oracle来说不是有效的SQL,除非SQLAlchemy在数据库中执行它之前做了一些魔术。最重要的是,我需要一个DBAL配置,该配置可与使用字符串前缀序列的Oracle和MySQL一起使用。
下面是示例代码:
from sqlalchemy.ext.declarative import declarative_base
from sqlalchemy import Column, Integer, String, ForeignKey, DateTime, Float, create_engine, Sequence
from sqlalchemy.orm import sessionmaker
Base = declarative_base()
class Person(Base):
__tablename__ = 'PERSONS'
id_seq = Sequence('PERSONS_SEQ', metadata=Base.metadata)
id = Column('ID', String(20), id_seq, primary_key=True)
created_date = Column('CREATED_DATE', DateTime)
def __init__(self, created_date):
self.created_date
engine = create_engine("<some connection string trolololo>")
Session = sessionmaker(bind=engine)
session = Session()
created_at = datetime.strptime('2019-01-01 12:02:03', '%Y-%m-%d %H:%M:%S')
new_person = Person(
created_date=created_at
)
session.add(new_account_payments)
session.flush()
session.commit()
错误/问题
最初的问题是导致此错误的顺序:
sqlalchemy.orm.exc.FlushError: Instance <Person at 0x7f1d7fb2de48> has a NULL identity key. If this is an auto-generated value, check that the database table allows generation of new primary key values, and that the mapped Column object is configured to expect these generated values. Ensure also that this flush() is not occurring at an inappropriate time, such as within a load() event.
我尝试添加autoincrement="auto"
,但这给了我一个不同的错误,表明它仅适用于INT,而不适用于STRING。
由于上述问题,我无法检查日期格式是否正常工作,但是一旦解决,我将更新线程。
谢谢!
答案 0 :(得分:1)
根据the docs
尽管以上是一种常见的习惯用法,但建议在大多数情况下,使用Sequence.metadata参数将Sequence与MetaData明确关联
因此,请尝试添加元数据并使用orm定义(如文档所示)
class Person(Base):
__tablename__ = 'PERSONS'
id_seq = Sequence('PERSONS_SEQ', metadata=Base.metadata)
id = Column(String(20), id_seq, server_default=id_seq.next_value(), primary_key=True)
created_date = Column('CREATED_DATE', DateTime)
答案 1 :(得分:0)
经过长时间的试验,上面的示例减去了__init__
函数,并且session.flush()
开始起作用。通过一次尝试几件事,我可能使问题变得过于复杂。
我仍然不知道如何在Sequence
上加上前缀。请让我知道。