Python 如何使用SQLAlchemy在SQL Server中执行UPSERT
根据这篇文章的答案: 以及sqlalchemy文档: 我都需要能够重建整个表,并且只需更新它。重建和插入工作正常,但我尝试在表上进行重复键更新,但运气不佳 运行以下代码:Python 如何使用SQLAlchemy在SQL Server中执行UPSERT,python,sql-server,sqlalchemy,Python,Sql Server,Sqlalchemy,根据这篇文章的答案: 以及sqlalchemy文档: 我都需要能够重建整个表,并且只需更新它。重建和插入工作正常,但我尝试在表上进行重复键更新,但运气不佳 运行以下代码: engine = create_engine(SQL_SERVER_HOST, SQL_SERVER_PORT, SQL_SERVER_DB, user, pwd) table_name = "service_area_prediction" # ----- If overwrite,
engine = create_engine(SQL_SERVER_HOST, SQL_SERVER_PORT, SQL_SERVER_DB, user, pwd)
table_name = "service_area_prediction"
# ----- If overwrite, delete table and insert new table with values -----
meta = sql.MetaData()
sap_test = sql.Table(
'sap_test', meta,
sql.Column('PredictionId', sql.VARCHAR(100), primary_key = True),
sql.Column('ContactID', sql.VARCHAR(100)),
sql.Column('login_id', sql.VARCHAR(100)),
sql.Column('local_time', sql.VARCHAR(100)),
sql.Column('area1', sql.VARCHAR(100)),
sql.Column('area2', sql.VARCHAR(100)),
sql.Column('area3', sql.VARCHAR(100)),
sql.Column('application', sql.VARCHAR(100)),
sql.Column('updatetime', sql.DATE),
)
# ----- This part works fine -----
if overwrite:
try:
sap_test.drop(engine)
except Exception:
print(f"{table_name} DOES NOT EXIST")
# ----- Chunk up data and upload to SQL in sections -----
data = output.to_dict(orient='records')
data = chunks(data, 100)
meta.create_all(engine)
con = engine.connect()
for d in data:
stmt = insert(sap_test).values(d)
con.execute(stmt)
# ----- Issue is here -----
else:
# ----- Chunk up data and upload to SQL in sections -----
data = output.to_dict(orient='records')
data = chunks(data, 100)
meta.create_all(engine)
con = engine.connect()
for d in data:
stmt = insert(sap_test).values(d)
update_stmt = stmt.on_duplicate_key_update(
area1=stmt.inserted.area1,
area2=stmt.inserted.area2,
updatetime=stmt.inserted.updatetime,
status='U')
con.execute(update_stmt)
返回此错误:
AttributeError: 'MSSQLCompiler' object has no attribute 'visit_on_duplicate_key_update'
The above exception was the direct cause of the following exception:
Traceback (most recent call last):
File "daily_prediction.py", line 211, in <module>
upload_to_sql(output, overwrite=False)
File "/yousee_analytics_and_optimization/src/implementations/sqluploadv2.py", line 140, in upload_to_sql
con.execute(update_stmt)
File "/usr/local/lib/python3.8/site-packages/sqlalchemy/engine/base.py", line 1011, in execute
return meth(self, multiparams, params)
File "/usr/local/lib/python3.8/site-packages/sqlalchemy/sql/elements.py", line 298, in _execute_on_connection
return connection._execute_clauseelement(self, multiparams, params)
File "/usr/local/lib/python3.8/site-packages/sqlalchemy/engine/base.py", line 1115, in _execute_clauseelement
compiled_sql = elem.compile(
File "<string>", line 1, in <lambda>
File "/usr/local/lib/python3.8/site-packages/sqlalchemy/sql/elements.py", line 481, in compile
return self._compiler(dialect, bind=bind, **kw)
File "/usr/local/lib/python3.8/site-packages/sqlalchemy/sql/elements.py", line 487, in _compiler
return dialect.statement_compiler(dialect, self, **kw)
File "/usr/local/lib/python3.8/site-packages/sqlalchemy/dialects/mssql/base.py", line 1571, in __init__
super(MSSQLCompiler, self).__init__(*args, **kwargs)
File "/usr/local/lib/python3.8/site-packages/sqlalchemy/sql/compiler.py", line 592, in __init__
Compiled.__init__(self, dialect, statement, **kwargs)
File "/usr/local/lib/python3.8/site-packages/sqlalchemy/sql/compiler.py", line 322, in __init__
self.string = self.process(self.statement, **compile_kwargs)
File "/usr/local/lib/python3.8/site-packages/sqlalchemy/sql/compiler.py", line 352, in process
return obj._compiler_dispatch(self, **kwargs)
File "/usr/local/lib/python3.8/site-packages/sqlalchemy/sql/visitors.py", line 96, in _compiler_dispatch
return meth(self, **kw)
File "/usr/local/lib/python3.8/site-packages/sqlalchemy/sql/compiler.py", line 2511, in visit_insert
post_values_clause = self.process(
File "/usr/local/lib/python3.8/site-packages/sqlalchemy/sql/compiler.py", line 352, in process
return obj._compiler_dispatch(self, **kwargs)
File "/usr/local/lib/python3.8/site-packages/sqlalchemy/sql/visitors.py", line 91, in _compiler_dispatch
util.raise_(
File "/usr/local/lib/python3.8/site-packages/sqlalchemy/util/compat.py", line 182, in raise_
raise exception
sqlalchemy.exc.UnsupportedCompilationError: Compiler <sqlalchemy.dialects.mssql.base.MSSQLCompiler object at 0x7f732779db20> can't render element of type <class 'sqlalchemy.dialects.mysql.dml.OnDuplicateClause'> (Background on this error at: http://sqlalche.me/e/13/l7de)
AttributeError:'MSSQLCompiler'对象没有属性'visit\u on\u duplicate\u key\u update'
上述异常是以下异常的直接原因:
回溯(最近一次呼叫最后一次):
文件“daily_prediction.py”,第211行,在
上传到sql(输出,覆盖=False)
文件“/yousee\u analytics\u and\u optimization/src/implementations/sqluploadv2.py”,第140行,在upload\u to\u sql中
合同执行(更新)
文件“/usr/local/lib/python3.8/site packages/sqlalchemy/engine/base.py”,执行中的第1011行
返回方法(自身、多线程、参数)
文件“/usr/local/lib/python3.8/site packages/sqlalchemy/sql/elements.py”,第298行,在连接上执行
返回连接。_execute_clauseelement(self、multiparams、params)
文件“/usr/local/lib/python3.8/site packages/sqlalchemy/engine/base.py”,第1115行,在执行条款元素中
compiled_sql=elem.compile(
文件“”,第1行,在
文件“/usr/local/lib/python3.8/site packages/sqlalchemy/sql/elements.py”,编译中的第481行
返回self.\u编译器(方言,bind=bind,**kw)
文件“/usr/local/lib/python3.8/site packages/sqlalchemy/sql/elements.py”,第487行,在编译器中
返回方言.statement_编译器(方言,self,**kw)
文件“/usr/local/lib/python3.8/site packages/sqlalchemy/dialogs/mssql/base.py”,第1571行,在__
超级(MSSQLCompiler,self)。\uuuuuu init\uuuu(*args,**kwargs)
文件“/usr/local/lib/python3.8/site packages/sqlalchemy/sql/compiler.py”,第592行,在__
已编译。uuu init_uuuu(self、方言、语句,**kwargs)
文件“/usr/local/lib/python3.8/site packages/sqlalchemy/sql/compiler.py”,第322行,在__
self.string=self.process(self.statement,**compile_-kwargs)
文件“/usr/local/lib/python3.8/site packages/sqlalchemy/sql/compiler.py”,第352行,正在处理中
返回对象\u编译器\u分派(自身,**kwargs)
文件“/usr/local/lib/python3.8/site packages/sqlalchemy/sql/visitors.py”,第96行,在编译器调度中
返回方法(自身,**千瓦)
文件“/usr/local/lib/python3.8/site packages/sqlalchemy/sql/compiler.py”,第2511行,在visit_insert中
post_值_子句=self.process(
文件“/usr/local/lib/python3.8/site packages/sqlalchemy/sql/compiler.py”,第352行,正在处理中
返回对象\u编译器\u分派(自身,**kwargs)
文件“/usr/local/lib/python3.8/site packages/sqlalchemy/sql/visitors.py”,第91行,在
提拉_(
文件“/usr/local/lib/python3.8/site packages/sqlalchemy/util/compat.py”,第182行,在raise中_
引发异常
sqlalchemy.exc.UnsupportedComplationError:编译器无法呈现类型为的元素(此错误的背景信息位于:http://sqlalche.me/e/13/l7de)
我花了几天的时间来解决这个问题,因此非常感谢您的帮助。您引用的两个链接都是针对MySQL的。T-SQL(即Microsoft SQL Server)不支持重复密钥,因此您可能需要执行与中描述的方法类似的操作。