Python 添加多对多记录时发生SQLAlchemy错误,直到列对象的';名称';分配

Python 添加多对多记录时发生SQLAlchemy错误,直到列对象的';名称';分配,python,sqlalchemy,Python,Sqlalchemy,我正试图接受与SQLAlchemy的这种多对多关系,但在提交会话时遇到了问题。在session.add节之前,未引发任何错误。直到触发session.commit()时才进行。我有点不理解这一点,因为到目前为止还没有关于错误的适当文档 代码如下: # import anything from sqlalchemy import Table, Column, Integer, String, Float, ForeignKey, DateTime, create_engine from sqlal

我正试图接受与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', Integer, ForeignKey('pp_anorev_lowsec.id')),
#     Column('inspection_id', Integer, 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), server_default=func.now()),
)

selected_inspection = session.query(Inspection).filter(Inspection.id < 10)[0]

new.inspection.append(selected_inspection)

session.add(new)
session.commit()
#导入任何内容
从sqlalchemy导入表、列、整数、字符串、浮点、ForeignKey、DateTime、create\u引擎
从sqlalchemy.orm导入关系,backref
从sqlalchemy.ext.declarative导入声明性基础
从sqlalchemy.orm导入sessionmaker
从sqlalchemy.sql导入函数
作为pd进口熊猫
将numpy作为np导入
引擎=创建引擎('sqlite:///D:\\temp\\AISEE.db',echo=True)
Base=声明性_Base(引擎)
#orm类声明
等级馈线(基本):
__tablename_uuu='pp_进料器'
id=列(整数,主键=True)
名称=列(字符串)
杆类(基础):
__tablename_uuuu='pp_pole'
id=列(字符串,主键=True)
feeder\u id=列(整数,ForeignKey('pp\u feeder.id'))
模型=列(字符串)
数字=列(字符串)
坐标=列(字符串)
#关系
馈线=关系(“馈线”,backref=“馈线”)
类组件(基):
__tablename_uuu='pp_组件'
id=列(字符串,主键=True)
极点id=列(字符串,外键('pp\u pole.id'))
名称=列(字符串)
nps=列(字符串)
明细表=列(字符串)
原始厚度=柱(浮动)
原始厚度英寸=柱(浮动)
#关系
极点=关系(“极点”,backref=“极点”)
类别检查(基本):
__tablename_uuu='pp_检验'
id=列(整数,主键=True)
component\u id=列(字符串,ForeignKey('pp\u component.id'))
日期=列(日期时间)
类别=列(字符串)
类型=列(字符串)
位置=列(字符串)
值\文本=列(字符串)
值\编号=列(浮动)
备注=列(字符串)
源文件=列(字符串)
#关系
组件=关系(“组件”,backref=“组件”)
#anorev_to_inspection=表('pp_anorev_to_inspection',Base.metadata,
#列('anorev_id',整数,外键('pp_anorev_lowsec.id'),
#列('inspection\u id',整数,ForeignKey('pp\u inspection.id'))
# )
类Anomalyreviewlocsec(基):
__tablename_uuu='pp_anorev_lowsec'
id=列(整数,主键=True)
检验日期=列(日期时间)
检查位置=列(字符串)
visual=列(字符串)
cml_12oclock=列(浮动)
cml_03oclock=列(浮动)
cml_06oclock=列(浮动)
cml_09oclock=列(浮动)
原始厚度参考=柱(浮动)
剩余厚度=柱(浮动)
异常类别=列(字符串)
检验标识=列(字符串)
创建时间=列(日期时间)
#关系
检查=关系(“肛门检查”)
类别检查(基本):
__tablename_uuuu='pp_anorev_to_inspection'
id=列(整数,主键=True)
anorev\u id=列(整数,外键('pp\u anorev\u lowsec.id'))
检验id=列(整数,外键('pp\u inspection.id'))
#关系
AnomalyReviewLoccsec=关系(AnomalyReviewLoccsec,back_populates=“”)
检验=关系(检验,backref=backref('pp\u检验'),远程侧=“检验.id”)
检查=关系(“检查”)
元数据=Base.metadata
会话=会话生成器(绑定=引擎)
会话=会话()
ew=异常值ReviewLocSec(
检查日期=列(DateTime(timezone=True),服务器默认值=func.now(),
检查位置=“距离地面-30 cm”,
visual=“Good”,
cml_12oclock=8.1,
cml_03oclock=8.3,
cml_06oclock=8.8,
cml_09oclock=8.2,
原始厚度参考=9.2,
剩余厚度=95,
异常_category=“绿色”,
检查id=“345456”,
已创建\u at=Column(DateTime(timezone=True),server\u default=func.now()),
)
所选检查=session.query(检查).filter(检查.id<10)[0]
新增.检验.追加(所选检验)
session.add(新建)
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, uowtransaction, 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, multiparams, params):

D:\python\lib\site-packages\sqlalchemy\sql\elements.py in _execute_on_connection(self, connection, multiparams, params)
    291     def _execute_on_connection(self, connection, multiparams, params):
    292         if self.supports_execution:
--> 293             return connection._execute_clauseelement(self, multiparams, params)
    294         else:
    295             raise exc.ObjectNotExecutableError(self)

D:\python\lib\site-packages\sqlalchemy\engine\base.py in _execute_clauseelement(self, elem, multiparams, 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, bind, dialect, **kw)
    466             else:
    467                 dialect = default.StrCompileDialect()
--> 468         return self._compiler(dialect, bind=bind, **kw)
    469 
    470     def _compiler(self, dialect, **kw):

D:\python\lib\site-packages\sqlalchemy\sql\elements.py in _compiler(self, dialect, **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, dialect, statement, column_keys, inline, **kwargs)
    588         self.truncated_names = {}
    589 
--> 590         Compiled.__init__(self, dialect, statement, **kwargs)
    591 
    592         if (

D:\python\lib\site-packages\sqlalchemy\sql\compiler.py in __init__(self, dialect, statement, bind, 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, obj, **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, insert_stmt, 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, stmt, **kw)
     65     finally:
     66         if should_restore:

D:\python\lib\site-packages\sqlalchemy\sql\crud.py in _get_crud_params(compiler, stmt, **kw)
    165             check_columns,
    166             values,
--> 167             kw,
    168         )
    169 

D:\python\lib\site-packages\sqlalchemy\sql\crud.py in _scan_cols(compiler, stmt, 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, stmt, c, col_key, parameters, _col_bind_name, implicit_returning, implicit_return_defaults, values, 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, obj, **kwargs)
    348 
    349     def process(self, obj, **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_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.
CompileError回溯(最近一次调用)
在里面
---->1会话提交()
提交(self)中的D:\python\lib\site packages\sqlalchemy\orm\session.py
1034 raise sa_exc.InvalidRequestError(“未开始任何交易”)
1035
->1036 self.transaction.commit()
1037
1038 def准备(自我):
提交(self)中的D:\python\lib\site packages\sqlalchemy\orm\session.py
501自维护激活(准备好的确定为真)
502如果自身状态未准备好:
-->503自我准备
504
505如果self.\u parent为None或self.nested:
D:\python\lib\site packages\sqlalchemy\orm\session.py in\u prepare\u impl(self)
480如果self.session.\u是\u clean():
481休息
-->482 self.session.flush()
483其他:
484升出冲洗器(
D:\python\lib\site packages\sqlalchemy\orm\session.py在flush中(self,objects)
2494尝试:
2495自冲洗=真
->2496自冲洗(对象)
2497最后:
2498自冲洗=错误
D:\python\lib\site packages\sqlalchemy\orm\session.py in\u flush(self,objects)
2635除了:
2636和util.safe_reraise()
->2637事务。回滚(_capture_exception=True)
2638
2639 def bulk_save_对象(
D:\python\lib\site packages\sqlalchemy\util\langhelpers.py in\uuuuuu退出(self,type,value,traceback)
67如果不是仅自我警告:
68