Использование операторов INSERT¶
Insert() а
Конструкция 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')
COMMIT1 CursorResult.inserted_primary_key В
>>> result.inserted_primary_key
(1,)Совет
<<<0>> composite primary key CursorResult.inserted_primary_key >
Изменено в версии 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_addressInsert.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 - в