Невозможно выбрать вставленное значение в sqlalchemyPython

Программы на Python
Ответить
Anonymous
 Невозможно выбрать вставленное значение в sqlalchemy

Сообщение Anonymous »

У меня есть следующий скрипт, который выполняет оператор вставки, а затем пытается выбрать вставленное значение.

Код: Выделить всё

from ast import For
from datetime import datetime
from sqlalchemy import DateTime, String, ForeignKey, Integer, bindparam, create_engine, insert, literal, select
from sqlalchemy.orm import DeclarativeBase, Mapped, mapped_column, relationship, sessionmaker

class Base(DeclarativeBase):
pass

class User(Base):
__tablename__ = "users"

id: Mapped[int] = mapped_column(primary_key=True, autoincrement=True)
name: Mapped[str] = mapped_column(String(200), nullable=False)

posts: Mapped[list["Post"]] = relationship(back_populates="author")

def __repr__(self) -> str:
return f'User(id={self.id!r}, name={self.name!r})'

class Post(Base):
__tablename__ = "posts"

id: Mapped[int] = mapped_column(primary_key=True, autoincrement=True)
title: Mapped[str] = mapped_column(String(200), nullable=False)
content: Mapped[str] = mapped_column(String, nullable=False)
creation_date: Mapped[datetime] = mapped_column(DateTime, nullable=False)
author_id: Mapped[int] = mapped_column(ForeignKey("users.id"))

author: Mapped["User"] = relationship(back_populates="posts")

def __repr__(self) -> str:
return f'Post(id={self.id!r}, title={self.title!r}, content={self.content!r}, creation_date={self.creation_date!r})'

engine = create_engine("sqlite:///example.db", echo=False)
Session = sessionmaker(engine)

Base.metadata.create_all(engine)

creation_date = datetime(2024, 1, 1, 12, 0, 0)

with Session.begin() as sess:
sess.add_all([User(name='john')])
sess.flush()

sess.execute(
insert(Post.__table__)
.from_select(
['title', 'content', 'creation_date', 'author_id'],
select(
literal('Title'),
literal('My first content.'),
bindparam('cd'),
select(User.id).where(User.name == 'john').scalar_subquery()
)
),
{'cd': creation_date}
)

print(sess.execute(select(Post).where(Post.creation_date == creation_date)).scalar_one())
При запуске скрипта возникает следующая ошибка.

Код: Выделить всё

Traceback (most recent call last):
File "app/app/backend/sqlalc.py", line 64, in 
print(sess.execute(select(Post).where(Post.creation_date == creation_date)).scalar_one())
File "app/venv39/lib/python3.9/site-packages/sqlalchemy/engine/result.py", line 1462, in scalar_one
return self._only_one_row(
File "app/venv39/lib/python3.9/site-packages/sqlalchemy/engine/result.py", line 752, in _only_one_row
raise exc.NoResultFound(
sqlalchemy.exc.NoResultFound: No row was found when one was required
Однако, когда я меняю Creation_date на следующее:

Код: Выделить всё

creation_date = datetime.now()
Тогда скрипт работает нормально.
Я нашел обходной путь для этой проблемы, но мне интересно, в чем причина этой проблемы.
Кто-нибудь знает, что вызывает эту проблему и почему изменение Creation_date таким образом решило проблему?

Подробнее здесь: https://stackoverflow.com/questions/798 ... sqlalchemy
Ответить

Быстрый ответ

Изменение регистра текста: 
Смайлики
:) :( :oops: :roll: :wink: :muza: :clever: :sorry: :angel: :read: *x)
Ещё смайлики…
   
К этому ответу прикреплено по крайней мере одно вложение.

Если вы не хотите добавлять вложения, оставьте поля пустыми.

Максимально разрешённый размер вложения: 15 МБ.

Вернуться в «Python»