我正在使用Postgresql作为方言在SQLAlchemy中创建一个关系数据库,并定义了一个列来存储postgresql.ARRAY类型,以及其他标准column-types。例如:
engine= create_engine('postgresql://localhost/test1',echo= False)
base_object= declarative_base()
class AE_Class(base_object):
__tablename__= 'AE_Table'
date= Column(String, primary_key= True)
experiment= Column(String)
machine= Column(String)
parameter1= Column(Integer)
parameter2= Column(Integer)
parameter3= Column(ARRAY(item_type= Integer,dimensions= 1))
def __repr__(self):
return "<AE_Class(date= '%s',experiment= '%s',machine= '%s',parameter1= '%s',parameter2= '%s',parameter3= '%s')>"%(\
self.date, self.experiment, self.machine, self.parameter1, self.parameter2,self.parameter3)
这很好,我认为。然后,
base_object.metadata.create_all(engine)
session_maker_obj= sessionmaker(bind= engine)
然后,创建一条要添加到数据库的记录。这是我要添加的信息:
rho_prof= {'Time': np.arange(0,20),'AirDensity': np.arange(0,20)**2}
k= '02-23-2004'
v= {'Exp':'lin vs circ polarization','Machine':'LIDAR2','Var1':32,
'Var2':0.9,'Var3':rho_prof}}
record1= AE_Class(machine= v['Machine'],date= k, experiment= v['Exp'],
parameter1= v['Var1'],parameter2= v['Var2'],
parameter3= v['Var3']['AirDensity'])
现在,我打开一个会话并向其中添加record1
:
orm_session= session_maker_obj()
orm_session.add(record1)
当我通过orm_session.new
检查会话时,可以看到该项目处于待处理状态并等待刷新:
>>> orm_session.new
IdentitySet([<AE_Class(date= '02-23-2004',experiment= 'lin vs circ polarization',machine= 'LIDAR2',parameter1= '32',parameter2= '0.9',parameter3= '[ 0 1 4 9 16 25 36 49 64 81 100 121 144 169 196 225 256 289
324 361]')>])
但是,当我orm_session.commit()
时,我收到错误消息(由于完整的追溯时间很长,因此被截断了):
sqlalchemy.exc.ProgrammingError: (psycopg2.errors.UndefinedColumn) column "parameter3" of relation "AE_Table" does not exist
LINE 1: ...table (date, experiment, machine, parameter1, parameter3...
^
该列如何未定义? parameter3确实存在于AE_Table中,并且我已经在实例中定义了它。为什么SQLAlchemy会识别为未定义?