Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/313.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/7/sql-server/26.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 如何使用SQLAlchemy在SQL Server中执行UPSERT_Python_Sql Server_Sqlalchemy - Fatal编程技术网

Python 如何使用SQLAlchemy在SQL Server中执行UPSERT

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,

根据这篇文章的答案:

以及sqlalchemy文档:

我都需要能够重建整个表,并且只需更新它。重建和插入工作正常,但我尝试在表上进行重复键更新,但运气不佳

运行以下代码:

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)不支持重复密钥,因此您可能需要执行与中描述的方法类似的操作。