{"id":3277,"date":"2025-01-04T14:54:17","date_gmt":"2025-01-04T05:54:17","guid":{"rendered":"https:\/\/nobunobu1717.site\/?p=3277"},"modified":"2025-01-04T14:57:10","modified_gmt":"2025-01-04T05:57:10","slug":"sqlalchemy%e3%81%a7%e5%a4%9a%e5%af%be%e5%a4%9a%e3%81%a7%e4%b8%80%e9%83%a8%e3%81%ae%e3%83%aa%e3%83%ac%e3%83%bc%e3%82%b7%e3%83%a7%e3%83%b3%e3%81%ae%e3%81%bfinsert%e3%81%97%e3%81%9f%e3%81%84%e5%a0%b4","status":"publish","type":"post","link":"https:\/\/nobunobu1717.site\/?p=3277","title":{"rendered":"SQLAlchemy\u3067\u591a\u5bfe\u591a\u3067\u4e00\u90e8\u306e\u30ea\u30ec\u30fc\u30b7\u30e7\u30f3\u306e\u307fInsert\u3057\u305f\u3044\u5834\u5408\u306e\u30e1\u30e2"},"content":{"rendered":"<h2>\u6982\u8981<\/h2>\n<p>SQLAlchemy2.0\u3067\u3001\u591a\u5bfe\u591a\u306e\u30ea\u30ec\u30fc\u30b7\u30e7\u30f3\u304c\u308b\u30c7\u30fc\u30bf\u3067\u5b58\u5728\u3057\u306a\u3044\u30c7\u30fc\u30bf\u306e\u307f\u3092Insert\u3057\u305f\u3044\u5834\u5408\u306e\u30e1\u30e2\u3002<\/p>\n<h2><span style=\"color: #1a1a1a;\"><span style=\"caret-color: #1a1a1a; font-size: 20px; background-color: #f3f3f3;\"><b>\u8aac\u660e<\/b><\/span><\/span><\/h2>\n<h3>\u8a73\u7d30<\/h3>\n<p>\u4e0b\u8a18\u306e\u3088\u3046\u306a\u591a\u5bfe\u591a\u306e\u30ea\u30ec\u30fc\u30b7\u30e7\u30f3\u3092\u6301\u3064\u30c7\u30fc\u30bf\u304c\u3042\u308b\u3068\u3059\u308b\u3002\uff08\u66f8\u7c4d\u3001\u30bf\u30b0\u30c7\u30fc\u30bf\uff09<\/p>\n<pre class=\"lang:python decode:true\">from sqlalchemy import String\r\nfrom sqlalchemy.orm import DeclarativeBase\r\nfrom sqlalchemy.orm import Mapped\r\nfrom sqlalchemy.orm import mapped_column\r\n\r\nclass Base(DeclarativeBase):\r\n    pass\r\n\r\nclass Tag(Base):\r\n    __tablename__ = \"tags\"\r\n    id: Mapped[int] = mapped_column(Integer, primary_key=True)\r\n    # \u7565\r\n\r\nclass Book(Base):\r\n    __tablename__ = \"books\"\r\n\r\n    id: Mapped[int] = mapped_column(Integer, primary_key=True)\r\n    tags: Mapped[list[Tag]] = relationship(secondary=books_publishers_association_table)\r\n    # \u7565\r\n\r\nbooks_tags_association_table = Table(\r\n    \"books_tags_association_table\",\r\n    Base.metadata,\r\n    Column(\"books_id\", ForeignKey(\"books.id\")),\r\n    Column(\"tags_id\", ForeignKey(\"tags.id\")),\r\n)\r\n\r\n<\/pre>\n<p>\u3053\u306e\u3088\u3046\u306a\u30c7\u30fc\u30bf\u306b\u5bfe\u3057\u3066\u3001\u66f8\u7c4d\u30c7\u30fc\u30bf\u3092\u65b0\u898f\u4f5c\u6210\u3059\u308b\u969b\u306b\u3001\u65b0\u898f\u306e\u30bf\u30b0\u3068\u65e2\u5b58\u306e\u30bf\u30b0\u304c\u6df7\u5728\u3057\u3066\u304a\u308a\u3001\u5b58\u5728\u3057\u306a\u3044\u30bf\u30b0\u306e\u307f\u3092INSERT\u3057\u305f\u3044\u3068\u3059\u308b\u3002<\/p>\n<p>\u4e0b\u8a18\u306e\u3088\u3046\u306b\u3001\u4e00\u5ea6\u30ea\u30ec\u30fc\u30b7\u30e7\u30f3\u3092\u6301\u3064\u30c7\u30fc\u30bf\u3092DB\u306b\u554f\u3044\u5408\u308f\u305b\u3066\u3001\u65e2\u306b\u5b58\u5728\u3059\u308b\u30c7\u30fc\u30bf\u3092\u53d6\u308a\u51fa\u3057\u3001\u305d\u3061\u3089\u3092add\u3057\u305f\u3044\u30c7\u30fc\u30bf\u306elist\u306b\u8ffd\u52a0\u3059\u308b\u3002<\/p>\n<p>\u305d\u3057\u3066\u3001\u5b58\u5728\u3057\u306a\u3044\u30c7\u30fc\u30bf(INSERT\u3057\u305f\u3044\u3082\u306e)\u306e\u307f\u3092list\u306b\u8ffd\u52a0\u3059\u308c\u3070\u826f\u3044\u3002<\/p>\n<pre class=\"lang:python decode:true\">class SqlBookRepository():\r\n    _session: Session\r\n\r\n    def create(self, item: BookData):\r\n        book = convert_dto(item)  # Book\u30af\u30e9\u30b9\u306e\u30c7\u30fc\u30bf\u3092\u751f\u6210\r\n        original = book.tag  # \u5909\u66f4\u524d\u306e\u5024\u3092\u4fdd\u6301\r\n        # tags\u306e\u30c7\u30fc\u30bf\u3092DB\u306b\u554f\u3044\u5408\u308f\u305b\r\n        book.tags = (\r\n            self._session.query(Tags).filter(Tags.id.in_([tag.id for tag in book.tags])).all()\r\n        )\r\n        # DB\u306b\u5b58\u5728\u3057\u306a\u3044\u30c7\u30fc\u30bf\u3092\u8ffd\u52a0\r\n        for original in originals:\r\n            matched = next((t for t in book.tags if t.id == original.name), None)\r\n            if matched is None:\r\n                book.tags.append(original)\r\n\r\n        self._session.add(book)\r\n        self._session.commit()\r\n<\/pre>\n","protected":false},"excerpt":{"rendered":"<p>\u6982\u8981 SQLAlchemy2.0\u3067\u3001\u591a\u5bfe\u591a\u306e\u30ea\u30ec\u30fc\u30b7\u30e7\u30f3\u304c\u308b\u30c7\u30fc\u30bf\u3067\u5b58\u5728\u3057\u306a\u3044\u30c7\u30fc\u30bf\u306e\u307f\u3092Insert\u3057\u305f\u3044\u5834\u5408\u306e\u30e1\u30e2\u3002 \u8aac\u660e \u8a73\u7d30 \u4e0b\u8a18\u306e\u3088\u3046\u306a\u591a\u5bfe\u591a\u306e\u30ea\u30ec\u30fc\u30b7\u30e7\u30f3\u3092\u6301\u3064\u30c7\u30fc\u30bf\u304c\u3042\u308b\u3068\u3059\u308b\u3002\uff08\u66f8\u7c4d\u3001 &#8230; <\/p>\n","protected":false},"author":1,"featured_media":1361,"comment_status":"open","ping_status":"open","sticky":false,"template":"","format":"standard","meta":[],"categories":[34],"tags":[],"_links":{"self":[{"href":"https:\/\/nobunobu1717.site\/index.php?rest_route=\/wp\/v2\/posts\/3277"}],"collection":[{"href":"https:\/\/nobunobu1717.site\/index.php?rest_route=\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/nobunobu1717.site\/index.php?rest_route=\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/nobunobu1717.site\/index.php?rest_route=\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/nobunobu1717.site\/index.php?rest_route=%2Fwp%2Fv2%2Fcomments&post=3277"}],"version-history":[{"count":3,"href":"https:\/\/nobunobu1717.site\/index.php?rest_route=\/wp\/v2\/posts\/3277\/revisions"}],"predecessor-version":[{"id":3280,"href":"https:\/\/nobunobu1717.site\/index.php?rest_route=\/wp\/v2\/posts\/3277\/revisions\/3280"}],"wp:featuredmedia":[{"embeddable":true,"href":"https:\/\/nobunobu1717.site\/index.php?rest_route=\/wp\/v2\/media\/1361"}],"wp:attachment":[{"href":"https:\/\/nobunobu1717.site\/index.php?rest_route=%2Fwp%2Fv2%2Fmedia&parent=3277"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/nobunobu1717.site\/index.php?rest_route=%2Fwp%2Fv2%2Fcategories&post=3277"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/nobunobu1717.site\/index.php?rest_route=%2Fwp%2Fv2%2Ftags&post=3277"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}