Снежинка - не удалось переписать многорядную вставку - (вставить в выделенную) - PullRequest
1 голос
/ 27 марта 2019

Я получил ошибку ниже, когда использую Sqlalchemy для вставки данных в хранилище Снежинка, любая идея?

Ошибка :

Не удалосьпереписать многострочную вставку [SQL: 'INSERT INTO виджетов (id, name, type)

SELECT% (id) s AS anon_1,% (name) s AS anon_2, widgets.id \ nFROM виджеты \ nWHEREwidgets.type =% (card_id) s ']

[параметры: ({' id ': 2,' name ':' Lychee ',' card_id ': 1}, {' id ': 3,'name': 'testing', 'card_id': 2})]

код :

from sqlalchemy import *

from snowflake.sqlalchemy import URL

# Helper function for local debugging
def createSQLAlchemyEngine():
    url = URL(
        account='',
        user='',
        password='',
        database='db',
        schema='',
        warehouse='',
        role='',
        proxy_host='',
        proxy_port=8099
    )
    engine = create_engine(url)
    return engine
conn = createSQLAlchemyEngine()
# Construct database
metadata = MetaData()
widgetTypes = Table('widgetTypes', metadata,
                    Column('id', INTEGER(), nullable=True),
                    Column('type', VARCHAR(), nullable=True))
widgets = Table('widgets', metadata,
                Column('id', INTEGER(), nullable=True),
                Column('name', VARCHAR(), nullable=True),
                Column('type', INTEGER(), nullable=True))
engine = conn
metadata.create_all(engine)
# Connect and populate db for testing
conn = engine.connect()
sel = select([bindparam('id'), bindparam('name'), widgets.c.id]).where(widgets.c.type == bindparam('card_id'))
ins = widgets.insert().from_select(['id', 'name', 'type'], sel)
conn.execute(ins, [
    # {'name': 'Melon',  'type_name': 'Squidgy'},
    {'id': 2, 'name': 'Lychee', 'card_id' : 1 },
    {'id': 3, 'name': 'testing', 'card_id': 2}
])
conn.close()

В основном, что я пытаюсьсделать это, как показано ниже, но Snowflake не поддерживает этот синтаксис.

insert into  tableXX

values('Z', 

(select max(b) +1 from tableXX a where a.CD = 'I'), 'val1', 'val2')

Итак, я должен сделать что-то подобное, но получил вышеуказанную ошибку.

insert into tableXX
select 'val1', 'val2', ifnull(max(c), 0) + 1 from tableXX where a.CD = 'I',
select 'val1', 'val2', ifnull(max(c), 0) + 1 from tableXX where a.CD = 'I',

Цель:

Логика, стоящая за кодом, заключается в том, что я хочу обновить базу sequence_id по максимуму существующего sequence_id записи, которая имеет тот же самый «CD» с новой записью.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...