Использование операторов 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')
COMMIT
1
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_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
- в