Сбой построения оператора SQLalchemy в on_duplicate_key_update () - PullRequest
0 голосов
/ 17 марта 2019

Я пытаюсь заставить sqlalchemy (1.3) on_duplicate_key_update () работать и не удается.

Я даже не могу понять, что случилось.Вот пример кода и трассировки, пожалуйста, сообщите:

from sqlalchemy.dialects.mysql import insert
import sqlalchemy as sa
import mysql.connector

engine=sa.create_engine('mysql+mysqldb://user:pass@[::1]db')
metadata = sa.MetaData()

# If you have access to a db, 
# just uncomment the following to create a testing table:

# metadata.reflect(bind=engine)
# numbers = sa.Table('numbers', metadata,
#     sa.Column('id', sa.Integer, primary_key=True),
#     sa.Column('number', sa.String(32), unique=True)
# )
# metadata.create_all(engine)

metadata.reflect(bind=engine)
conn=engine.connect()

# https://docs.sqlalchemy.org/en/latest/dialects/mysql.html#insert-on-duplicate-key-update-upsert
ins=insert(metadata.tables['numbers']).values({'number':"one"})
on_dup=ins.on_duplicate_key_update({'number':"two"})

r=conn.execute(on_dup)
print(r.fetchone())

После печати (on_dup)

AttributeError Traceback (последний вызов был последним) E: \ Coding \ Anaconda3 \ envs \ tf\ lib \ site-packages \ sqlalchemy \ sql \ members.py в _compiler_dispatch (self, visitor, ** kw) 86 try: ---> 87 meth = getter (visitor) 88 кроме AttributeError:

AttributeError: 'StrSQLCompiler' object has no attribute 'visit_on_duplicate_key_update'

During handling of the above exception, another exception occurred:

UnsupportedCompilationError
           Traceback (most recent call

последний) через 18 ins = insert (metadata.tables ['numbers']). Values ​​({'number': 12}) 19 on_dup = ins.on_duplicate_key_update ({'number': 2}) ---> 20 print (on_dup) 21 con.execute (on_dup)

E: \ Coding \ Anaconda3 \ envs \ tf \ lib \ site-packages \ sqlalchemy \ sql \ elements.py в str (self) 470 def str (self): 471, если util.py3k: -> 472 return str (self.compile ()) 473 else: 474 вернуть unicode (self.compile()). закодировать (# noqa

in (self, bind, dialect, ** kw)

E: \ Coding \ Anaconda3 \ envs \ tf \ lib \ site-packages \ sqlalchemy\ sql \ elements.py в компиляции (self, default, bind, dialect, ** kw) 460 else: 461 dialect = default.StrCompileDialect () -> 462 возвращает self._compiler (диалект, bind = bind, ** квт) 463 464 def _compiler (self, диалект, ** квт):

E: \ Coding \ Anaconda3 \ envs\ tf \ lib \ site-packages \ sqlalchemy \ sql \ elements.py в _compiler (self, dialect, ** kw) 466 диалект. "" "467 -> 468 возвращают dialect.statement_compiler (диалект, self, ** квт)) 469 470 def str (self):

E: \ Coding \ Anaconda3 \ envs \ tf \ lib \ site-packages \ sqlalchemy \ sql \ compiler.py в init (self, dialect, оператор, column_keys, inline, ** kwargs) 560 # dialect.label_length или dialect.max_identifier_length 561 self.truncated_names = {} -> 562 Скомпилировано. init (self,диалект, оператор ** ** kwargs) 563 564 if (

E: \ Coding \ Anaconda3 \ envs \ tf \ lib \ site-packages \ sqlalchemy \ sql \ compiler.py в init (self, dialect, Statement, bind, schema_translate_map, compile_kwargs) 317, если self.can_execute: 318 self.execution_options = Statement._execution_options -> 319 self.string = self.process (self.statement,** compile_kwargs) 320 321 @ util.deprecated (

E: \ Coding \ Anaconda3 \ envs \ tf \ lib \ site-packages \ sqlalchemy \ sql \ compiler.py в процессе (self, obj, **kwargs) 348 349 def процесс (self, obj, ** kwargs): -> 350 return obj._compiler_dispatch (self, ** kwargs) 351 352 def str (self):

E: \ Coding \ Anaconda3 \ envs \ tf \ lib \ site-packages \ sqlalchemy \ sql \ members.py в _compiler_dispatch (self, visitor, ** kw) 89 повысить exc.UnsupportedCompilationError (посетитель, cls) 90 других: --> 91 вернуть мет (себя, ** кВт) 92 93 остальное:

E: \ Coding \ Anaconda3 \ envs \ tf \ lib \ site-packages \ sqlalchemy \ sql \ compiler.py в visit_insert (self, insert_stmt, asfrom, ** kw) 2458, если insert_stmt._post_values_clause не является None: 2459
post_values_clause = self.process (-> 2460 insert_stmt._post_values_clause, ** kw 2461) 2462, если post_values_47_ * 10* E: \ Coding \ Anaconda3 \ envs \ tf \ lib \ site-packages \ sqlalchemy \ sql \ compiler.py в процессе (self, obj, ** kwargs) 348 349 процесс def (self, obj, ** kwargs):-> 350 return obj._compiler_dispatch (self, ** kwargs) 351352 def str (self):

E: \ Coding \ Anaconda3 \ envs \ tf \ lib \ site-packages \ sqlalchemy \ sql \ members.py в _compiler_dispatch (self, посетитель,** kw) 87 meth = getter (посетитель) 88 кроме AttributeError: ---> 89 повышение exc.UnsupportedCompilationError (посетитель, cls) 90 else: 91 возврат мет (self, ** kw)

UnsupportedCompilationError: Compiler
<sqlalchemy.sql.compiler.StrSQLCompiler object at 0x0000025A48769A90>
can't render element of type <class sqlalchemy.dialects.mysql.dml.OnDuplicateClause'>

и после conn.execute (on_dup) я получаю NoneType для result.fetchone ()

Я подключаюсь к MariaDB 10.3.13 с sqlalchemy 1.3.1 из conda-forge.Запуск в ноутбуке Jupyter v5.7.6 с Python 3.6.7

...