Использование операторов INSERT

Insert() а

ORM Readers -.

unit of work`Эт :ref:`tutorial_orm_bulk о

:ref:`tutorial_inserting_orm`К с

Конструкция SQL-выражения insert()

:class:`_sql.Insert`A

>>> from sqlalchemy import insert
>>> stmt = insert(user_table).values(name="spongebob", fullname="Spongebob Squarepants")

``stmt``В качестве Insert примера можно привести

>>> print(stmt)
{printsql}INSERT INTO user_account (name, fullname) VALUES (:name, :fullname)

compile .

>>> compiled = stmt.compile()

Insert Параметры отправки name fullname bound parameters Compiled O

>>> compiled.params
{'name': 'spongebob', 'fullname': 'Spongebob Squarepants'}

Выполнение заявления

``user_table``В

>>> with engine.connect() as conn:
...     result = conn.execute(stmt)
...     conn.commit()
{execsql}BEGIN (implicit)
INSERT INTO user_account (name, fullname) VALUES (?, ?)
[...] ('spongebob', 'Spongebob Squarepants')
COMMIT

1 CursorResult.inserted_primary_key В

>>> result.inserted_primary_key
(1,)

Изменено в версии 1.4.8: <<<0>> Row >

Обычно INSERT автоматически генерирует предложение «values».

Insert.values() с

>>> print(insert(user_table))
{printsql}INSERT INTO user_account (id, name, fullname) VALUES (:id, :name, :fullname)

Insert Insert.values() Connection.execute() Insert I

>>> with engine.connect() as conn:
...     result = conn.execute(
...         insert(user_table),
...         [
...             {"name": "sandy", "fullname": "Sandy Cheeks"},
...             {"name": "patrick", "fullname": "Patrick Star"},
...         ],
...     )
...     conn.commit()
{execsql}BEGIN (implicit)
INSERT INTO user_account (name, fullname) VALUES (?, ?)
[...] [('sandy', 'Sandy Cheeks'), ('patrick', 'Patrick Star')]
COMMIT{stop}

tutorial_multiple_parameters`Эк :func:`_sql.text Connection.execute() Insert Connection Insert с

Deep Alchemy

Здравствуйте, добро пожаловать в первый выпуск Deep Alchemy. Человек слева известен как Алхимик, и вы можете заметить, что он не волшебник, поскольку остроконечная шляпа не торчит вверх. Алхимик появляется, чтобы описать вещи, которые, как правило, являются более продвинутыми и/или сложными и, кроме того, обычно не нужны, но по какой-то причине он считает, что вы должны знать об этой вещи, которую может делать SQLAlchemy.

``address_table``В т Insert.values() scalar subquery select() bindparam() .

``user_table``Это

>>> from sqlalchemy import select, bindparam
>>> scalar_subq = (
...     select(user_table.c.id)
...     .where(user_table.c.name == bindparam("username"))
...     .scalar_subquery()
... )

>>> with engine.connect() as conn:
...     result = conn.execute(
...         insert(address_table).values(user_id=scalar_subq),
...         [
...             {
...                 "username": "spongebob",
...                 "email_address": "spongebob@sqlalchemy.org",
...             },
...             {"username": "sandy", "email_address": "sandy@sqlalchemy.org"},
...             {"username": "sandy", "email_address": "sandy@squirrelpower.org"},
...         ],
...     )
...     conn.commit()
{execsql}BEGIN (implicit)
INSERT INTO address (user_id, email_address) VALUES ((SELECT user_account.id
FROM user_account
WHERE user_account.name = ?), ?)
[...] [('spongebob', 'spongebob@sqlalchemy.org'), ('sandy', 'sandy@sqlalchemy.org'),
('sandy', 'sandy@squirrelpower.org')]
COMMIT{stop}

Таким образом, в наших таблицах появились еще несколько интересных данных, которые мы будем использовать в последующих разделах.

Совет

:meth:`_sql.Insert.values`A

>>> print(insert(user_table).values().compile(engine))
{printsql}INSERT INTO user_account DEFAULT VALUES

ВСТАВКА… ВОЗВРАТ

returning`Сай :class:`_engine.Result() т

>>> insert_stmt = insert(address_table).returning(
...     address_table.c.id, address_table.c.email_address
... )
>>> print(insert_stmt)
{printsql}INSERT INTO address (id, user_id, email_address)
VALUES (:id, :user_id, :email_address)
RETURNING address.id, address.email_address

Insert.from_select`Эт :ref:`tutorial_insert_from_select() о

>>> select_stmt = select(user_table.c.id, user_table.c.name + "@aol.com")
>>> insert_stmt = insert(address_table).from_select(
...     ["user_id", "email_address"], select_stmt
... )
>>> print(insert_stmt.returning(address_table.c.id, address_table.c.email_address))
{printsql}INSERT INTO address (user_id, email_address)
SELECT user_account.id, user_account.name || :name_1 AS anon_1
FROM user_account RETURNING address.id, address.email_address

Совет

Функция RETURNING также поддерживается операторами UPDATE и DELETE, которые будут представлены далее в этом учебном пособии.

:ref:`engine_insertmanyvalues`Fo

См.также

:ref:`orm_queryguide_bulk_insert`Fo

INSERT…FROM SELECT

Insert Insert.from_select() select() address user_account aol.com l

>>> select_stmt = select(user_table.c.id, user_table.c.name + "@aol.com")
>>> insert_stmt = insert(address_table).from_select(
...     ["user_id", "email_address"], select_stmt
... )
>>> print(insert_stmt)
{printsql}INSERT INTO address (user_id, email_address)
SELECT user_account.id, user_account.name || :name_1 AS anon_1
FROM user_account

Эта конструкция используется в тех случаях, когда требуется скопировать данные из другой части базы данных непосредственно в новый набор строк, без необходимости получения и повторной отправки данных от клиента.

См.также

Insert - в

Вернуться на верх