Python 添加多对多记录时发生SQLAlchemy错误,直到列对象的';名称';分配
我正试图接受与SQLAlchemy的这种多对多关系,但在提交会话时遇到了问题。在session.add节之前,未引发任何错误。直到触发session.commit()时才进行。我有点不理解这一点,因为到目前为止还没有关于错误的适当文档 代码如下: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
# 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