【发布时间】:2019-04-21 21:03:36
【问题描述】:
我正在尝试将 if_exists pandas to_sql 参数与 sqlalchemy 一起使用,但我似乎无法让它工作
版本
- sqlalchemy 版本 1.2.12
- 熊猫版本 0.23.4
-
python 3.5.2
engine = create_engine(postgress_connection_string, echo=True) df1 = pd.DataFrame([['Abe','1','True'],['Ben','2','True'],['Charlie','3','True']], columns=['Name','Number','Other']) df1.to_sql('df_tbl',engine) #works if table doesn't exist, else fails df1.to_sql('df_tbl',engine, if_exists='replace') #fails with error message
错误:AttributeError:“连接”对象没有属性“_engine”
调试输出
----------------------------------- ---------------------------- AttributeError Traceback(最近调用 最后)在 7 df_rides_stops.rename(index=str, columns={'orig_ad_id':'ad_id', 'orig_stay_time':'stay_time','orig_arrival_utc':'arrival_utc'},inplace=True) 8 df_rides_stops.head() ----> 9 df_rides_stops.to_sql('rides',engine, if_exists='replace') 10
~/dev/Ride/qgis3/lib/python3.5/site-packages/pandas/core/generic.py 在 to_sql(self, name, con, schema, if_exists, index, index_label, chunksize, dtype) 2128 sql.to_sql(self, name, con, 架构=架构,if_exists=if_exists,2129
索引=索引,索引标签=索引标签,块大小=块大小, -> 2130 dtype=dtype) 2131 2132 def to_pickle(self, path, compression='infer',~/dev/Ride/qgis3/lib/python3.5/site-packages/pandas/io/sql.py 在 to_sql(frame, name, con, schema, if_exists, index, index_label, 块大小,数据类型) 第448章 第449章 --> 450 块大小=块大小,dtype=dtype) 451 第452章
~/dev/Ride/qgis3/lib/python3.5/site-packages/pandas/io/sql.py 在 to_sql(self, frame, name, if_exists, index, index_label, schema, 块大小,数据类型)1124
if_exists=if_exists, index_label=index_label, 1125
架构=架构,dtype=dtype) -> 1126 table.create() 1127 table.insert(chunksize) 1128 if (not name.isdigit() and not name.islower()):~/dev/Ride/qgis3/lib/python3.5/site-packages/pandas/io/sql.py 在 创建(自我) 563 raise ValueError("表 '%s' 已经存在。" % self.name) 第564章 --> 565 self.pd_sql.drop_table(self.name, self.schema) 第566章 第567章
~/dev/Ride/qgis3/lib/python3.5/site-packages/pandas/io/sql.py 在 drop_table(自我,表名,模式)1173模式=模式 或 self.meta.schema 1174 如果 self.has_table(table_name, 架构): -> 1175 self.meta.reflect(only=[table_name], schema=schema) 1176 self.get_table(table_name, 架构).drop() 1177 self.meta.clear()
~/dev/Ride/qgis3/lib/python3.5/site-packages/sqlalchemy/sql/schema.py 在反射(自我,绑定,模式,视图,仅,extend_existing, autoload_replace, **dialect_kwargs) 3961 for name in 加载:3962 尝试: -> 3963 Table(name, self, **reflect_opts) 3964 除了 exc.UnreflectableTableError as uerr: 3965
util.warn("跳表 %s: %s" % (name, uerr))~/dev/Ride/qgis3/lib/python3.5/site-packages/sqlalchemy/sql/schema.py 在新(cls,*args,**kw) 455 除外: 456 与 util.safe_reraise(): --> 457 元数据._remove_table(名称,模式) 458 第459章
~/dev/Ride/qgis3/lib/python3.5/site-packages/sqlalchemy/util/langhelpers.py 在退出(自我,类型_,价值,回溯) 64 self._exc_info = None #删除潜在的循环引用 65 如果不是 self.warn_only: ---> 66 compat.reraise(exc_type, exc_value, exc_tb) 67 其他: 68 如果不是 compat.py3k 和 self._exc_info 和 self._exc_info[1]:
~/dev/Ride/qgis3/lib/python3.5/site-packages/sqlalchemy/util/compat.py 在加注中(tp,值,tb,原因) 247 如果 value.traceback 不是 tb: 第248章 --> 249 提升值 250 251 其他:
~/dev/Ride/qgis3/lib/python3.5/site-packages/sqlalchemy/sql/schema.py 在新(cls,*args,**kw) 450 metadata._add_table(名称,架构,表) 451尝试: --> 452 table._init(名称,元数据,*args,**kw) 453 table.dispatch.after_parent_attach(表,元数据) 454返回表
~/dev/Ride/qgis3/lib/python3.5/site-packages/sqlalchemy/sql/schema.py 在 _init(self, name, metadata, *args, **kwargs) 第532章 533 元数据,autoload_with, --> 534 包含_列,_extend_on=_extend_on) 535 536 # 初始化所有列等对象。反思后完成
~/dev/Ride/qgis3/lib/python3.5/site-packages/sqlalchemy/sql/schema.py 在 _autoload(self, metadata, autoload_with, include_columns, exclude_columns,_extend_on) 第545章 第546章 --> 547 _extend_on=_extend_on 548) 第549章:
~/dev/Ride/qgis3/lib/python3.5/site-packages/sqlalchemy/engine/base.py 在 run_callable(self, callable_, *args, **kwargs) 1543 1544
""" -> 1545 return callable_(self, *args, **kwargs) 1546 1547 def _run_visitor(self, visitorcallable, element, **kwargs):~/dev/Ride/qgis3/lib/python3.5/site-packages/sqlalchemy/engine/default.py 在反射表(自我,连接,表,include_columns, 排除列,**选择) 第387章 388 自我、连接、表、include_columns、exclude_columns、**opts): --> 389 insp = 反射.Inspector.from_engine(连接) 第390章 391表,include_columns,exclude_columns,**opts)
~/dev/Ride/qgis3/lib/python3.5/site-packages/sqlalchemy/engine/reflection.py 在 from_engine(cls, 绑定) 第132章 133 if hasattr(bind.dialect, 'inspector'): --> 134 返回 bind.dialect.inspector(bind) 135返回检查员(绑定) 136
~/dev/Ride/qgis3/lib/python3.5/site-packages/sqlalchemy/dialects/postgresql/base.py 在 init(self, conn) 2026 2027 def init(self, conn): -> 2028 reflect.Inspector.init(self, conn) 2029 2030 def get_table_oid(self, table_name, schema=None):
~/dev/Ride/qgis3/lib/python3.5/site-packages/sqlalchemy/engine/reflection.py 在 init(自我,绑定) 101#设置引擎 102 如果有属性(绑定,“引擎”): --> 103 self.engine = bind._engine 104 其他: 105 self.engine = 绑定
AttributeError: 'Connection' 对象没有属性 '_engine'
【问题讨论】:
-
如果您使用默认架构,这不会是问题,replace 参数会在不同架构上引发错误,因为 DROP 会直接进入默认架构,解决方案是添加 {schema =' your_schema'}
标签: python-3.x pandas sqlalchemy