如何解决添加多对多记录时显示SQLAlchemy错误,提示在分配“名称”之前无法编译Column对象
我试图吞下与SQLAlchemy的这种多对多关系,但是在提交会话时遇到了问题。到session.add部分为止,未引发任何错误。直到session.commit()被触发。到目前为止,还没有关于错误的适当文档,对此我感到很沮丧。
这是代码:
# import anything
from sqlalchemy import Table,Column,Integer,String,Float,ForeignKey,DateTime,create_engine
from sqlalchemy.orm import relationship,backref
from sqlalchemy.ext.declarative import declarative_base
from sqlalchemy.orm import sessionmaker
from sqlalchemy.sql import func
import pandas as pd
import numpy as np
engine = create_engine('sqlite:///D:\\temp\\AISEE.db',echo=True)
Base = declarative_base(engine)
# orm class declaration
class Feeder(Base):
__tablename__ = 'pp_feeder'
id = Column(Integer,primary_key=True)
name = Column(String)
class Pole(Base):
__tablename__ = 'pp_pole'
id = Column(String,primary_key=True)
feeder_id = Column(Integer,ForeignKey('pp_feeder.id'))
model = Column(String)
number = Column(String)
coordinate = Column(String)
# relationship
feeder = relationship("Feeder",backref="Feeder")
class Component(Base):
__tablename__ = 'pp_component'
id = Column(String,primary_key=True)
pole_id = Column(String,ForeignKey('pp_pole.id'))
name = Column(String)
nps = Column(String)
schedule = Column(String)
original_thickness_mm = Column(Float)
original_thickness_inch = Column(Float)
# relationship
pole = relationship("Pole",backref="Pole")
class Inspection(Base):
__tablename__ = 'pp_inspection'
id = Column(Integer,primary_key=True)
component_id = Column(String,ForeignKey('pp_component.id'))
date = Column(DateTime)
category = Column(String)
type = Column(String)
location = Column(String)
value_text = Column(String)
value_number = Column(Float)
remarks = Column(String)
source_file = Column(String)
# relationship
component = relationship("Component",backref="Component")
# anorev_to_inspection = Table('pp_anorev_to_inspection',Base.metadata,# Column('anorev_id',ForeignKey('pp_anorev_lowsec.id')),# Column('inspection_id',ForeignKey('pp_inspection.id'))
# )
class Anomalyreviewlocsec(Base):
__tablename__ = 'pp_anorev_lowsec'
id = Column(Integer,primary_key=True)
inspection_date = Column(DateTime)
inspection_location = Column(String)
visual = Column(String)
cml_12oclock = Column(Float)
cml_03oclock = Column(Float)
cml_06oclock = Column(Float)
cml_09oclock = Column(Float)
original_thickness_ref = Column(Float)
remaining_thickness = Column(Float)
anomaly_category = Column(String)
inspection_ids = Column(String)
created_at = Column(DateTime)
# relationship
inspection = relationship("Anorevinspection")
class Anorevinspection(Base):
__tablename__ = 'pp_anorev_to_inspection'
id = Column(Integer,primary_key=True)
anorev_id = Column(Integer,ForeignKey('pp_anorev_lowsec.id'))
inspection_id = Column(Integer,ForeignKey('pp_inspection.id'))
# relationship
anomalyreviewlocsec = relationship(Anomalyreviewlocsec,back_populates="")
inspection = relationship(Inspection,backref=backref('pp_inspection'),remote_side="Inspection.id")
inspection = relationship("Inspection")
metadata = Base.metadata
Session = sessionmaker(bind = engine)
session = Session()
ew = Anomalyreviewlocsec(
inspection_date = Column(DateTime(timezone=True),server_default=func.now()),inspection_location = "-30 cm from Ground",visual = "Good",cml_12oclock = 8.1,cml_03oclock = 8.3,cml_06oclock = 8.8,cml_09oclock = 8.2,original_thickness_ref = 9.2,remaining_thickness = 95,anomaly_category = "GREEN",inspection_ids = "345,456",created_at = Column(DateTime(timezone=True),)
selected_inspection = session.query(Inspection).filter(Inspection.id < 10)[0]
new.inspection.append(selected_inspection)
session.add(new)
session.commit()
我得到的错误:
CompileError Traceback (most recent call last)
<ipython-input-20-83a1dbdbd92a> in <module>
----> 1 session.commit()
D:\python\lib\site-packages\sqlalchemy\orm\session.py in commit(self)
1034 raise sa_exc.InvalidRequestError("No transaction is begun.")
1035
-> 1036 self.transaction.commit()
1037
1038 def prepare(self):
D:\python\lib\site-packages\sqlalchemy\orm\session.py in commit(self)
501 self._assert_active(prepared_ok=True)
502 if self._state is not PREPARED:
--> 503 self._prepare_impl()
504
505 if self._parent is None or self.nested:
D:\python\lib\site-packages\sqlalchemy\orm\session.py in _prepare_impl(self)
480 if self.session._is_clean():
481 break
--> 482 self.session.flush()
483 else:
484 raise exc.FlushError(
D:\python\lib\site-packages\sqlalchemy\orm\session.py in flush(self,objects)
2494 try:
2495 self._flushing = True
-> 2496 self._flush(objects)
2497 finally:
2498 self._flushing = False
D:\python\lib\site-packages\sqlalchemy\orm\session.py in _flush(self,objects)
2635 except:
2636 with util.safe_reraise():
-> 2637 transaction.rollback(_capture_exception=True)
2638
2639 def bulk_save_objects(
D:\python\lib\site-packages\sqlalchemy\util\langhelpers.py in __exit__(self,type_,value,traceback)
67 if not self.warn_only:
68 compat.raise_(
---> 69 exc_value,with_traceback=exc_tb,70 )
71 else:
D:\python\lib\site-packages\sqlalchemy\util\compat.py in raise_(***failed resolving arguments***)
176
177 try:
--> 178 raise exception
179 finally:
180 # credit to
D:\python\lib\site-packages\sqlalchemy\orm\session.py in _flush(self,objects)
2595 self._warn_on_events = True
2596 try:
-> 2597 flush_context.execute()
2598 finally:
2599 self._warn_on_events = False
D:\python\lib\site-packages\sqlalchemy\orm\unitofwork.py in execute(self)
420 else:
421 for rec in topological.sort(self.dependencies,postsort_actions):
--> 422 rec.execute(self)
423
424 def finalize_flush_changes(self):
D:\python\lib\site-packages\sqlalchemy\orm\unitofwork.py in execute(self,uow)
587 self.mapper,588 uow.states_for_mapper_hierarchy(self.mapper,False,False),--> 589 uow,590 )
591
D:\python\lib\site-packages\sqlalchemy\orm\persistence.py in save_obj(base_mapper,states,uowtransaction,single)
243 mapper,244 table,--> 245 insert,246 )
247
D:\python\lib\site-packages\sqlalchemy\orm\persistence.py in _emit_insert_statements(base_mapper,cached_connections,mapper,table,insert,bookkeeping)
1130 if value_params:
1131 result = connection.execute(
-> 1132 statement.values(value_params),params
1133 )
1134 else:
D:\python\lib\site-packages\sqlalchemy\engine\base.py in execute(self,object_,*multiparams,**params)
982 )
983 else:
--> 984 return meth(self,multiparams,params)
985
986 def _execute_function(self,func,params):
D:\python\lib\site-packages\sqlalchemy\sql\elements.py in _execute_on_connection(self,connection,params)
291 def _execute_on_connection(self,params):
292 if self.supports_execution:
--> 293 return connection._execute_clauseelement(self,params)
294 else:
295 raise exc.ObjectNotExecutableError(self)
D:\python\lib\site-packages\sqlalchemy\engine\base.py in _execute_clauseelement(self,elem,params)
1092 schema_translate_map=self.schema_for_object
1093 if not self.schema_for_object.is_default
-> 1094 else None,1095 )
1096
<string> in <lambda>(self,bind,dialect,**kw)
D:\python\lib\site-packages\sqlalchemy\sql\elements.py in compile(self,default,**kw)
466 else:
467 dialect = default.StrCompileDialect()
--> 468 return self._compiler(dialect,bind=bind,**kw)
469
470 def _compiler(self,**kw):
D:\python\lib\site-packages\sqlalchemy\sql\elements.py in _compiler(self,**kw)
472 Dialect."""
473
--> 474 return dialect.statement_compiler(dialect,self,**kw)
475
476 def __str__(self):
D:\python\lib\site-packages\sqlalchemy\sql\compiler.py in __init__(self,statement,column_keys,inline,**kwargs)
588 self.truncated_names = {}
589
--> 590 Compiled.__init__(self,**kwargs)
591
592 if (
D:\python\lib\site-packages\sqlalchemy\sql\compiler.py in __init__(self,schema_translate_map,compile_kwargs)
317 if self.can_execute:
318 self.execution_options = statement._execution_options
--> 319 self.string = self.process(self.statement,**compile_kwargs)
320
321 @util.deprecated(
D:\python\lib\site-packages\sqlalchemy\sql\compiler.py in process(self,obj,**kwargs)
348
349 def process(self,**kwargs):
--> 350 return obj._compiler_dispatch(self,**kwargs)
351
352 def __str__(self):
D:\python\lib\site-packages\sqlalchemy\sql\visitors.py in _compiler_dispatch(self,visitor,**kw)
93 )
94 else:
---> 95 return meth(self,**kw)
96
97 else:
D:\python\lib\site-packages\sqlalchemy\sql\compiler.py in visit_insert(self,insert_stmt,asfrom,**kw)
2426
2427 crud_params = crud._setup_crud_params(
-> 2428 self,crud.ISINSERT,**kw
2429 )
2430
D:\python\lib\site-packages\sqlalchemy\sql\crud.py in _setup_crud_params(compiler,stmt,local_stmt_type,**kw)
62 try:
63 if local_stmt_type in (ISINSERT,ISUPDATE):
---> 64 return _get_crud_params(compiler,**kw)
65 finally:
66 if should_restore:
D:\python\lib\site-packages\sqlalchemy\sql\crud.py in _get_crud_params(compiler,**kw)
165 check_columns,166 values,--> 167 kw,168 )
169
D:\python\lib\site-packages\sqlalchemy\sql\crud.py in _scan_cols(compiler,parameters,_getattr_col_key,_column_as_key,_col_bind_name,check_columns,values,kw)
329 implicit_return_defaults,330 values,--> 331 kw,332 )
333
D:\python\lib\site-packages\sqlalchemy\sql\crud.py in _append_param_parameter(compiler,c,col_key,implicit_returning,implicit_return_defaults,kw)
418 if not c.primary_key:
419 compiler.postfetch.append(c)
--> 420 value = compiler.process(value.self_group(),**kw)
421 values.append((c,value))
422
D:\python\lib\site-packages\sqlalchemy\sql\compiler.py in process(self,**kw)
96
97 else:
D:\python\lib\site-packages\sqlalchemy\sql\compiler.py in visit_column(self,column,add_to_result_map,include_table,**kwargs)
867 name = orig_name = column.name
868 if name is None:
--> 869 name = self._fallback_column_name(column)
870
871 is_literal = column.is_literal
D:\python\lib\site-packages\sqlalchemy\sql\compiler.py in _fallback_column_name(self,column)
859 def _fallback_column_name(self,column):
860 raise exc.CompileError(
--> 861 "Cannot compile Column object until " "its 'name' is assigned."
862 )
863
CompileError: Cannot compile Column object until its 'name' is assigned.
有什么我可以解决的吗?
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。