{"id":10020836,"date":"2025-06-19T22:09:07","date_gmt":"2025-06-19T14:09:07","guid":{"rendered":"https:\/\/itmax.cn\/?p=10020836"},"modified":"2025-06-19T22:09:07","modified_gmt":"2025-06-19T14:09:07","slug":"%e6%b3%a8%e6%84%8f%e9%81%bf%e5%9d%91%ef%bc%8cpeewee-%e7%9b%b4%e6%8e%a5%e6%93%8d%e4%bd%9c-db-%e5%af%b9%e8%b1%a1%e8%bf%90%e8%a1%8c%e5%8e%9f%e7%94%9f-sql-%e7%9a%84%e6%97%b6%e5%80%99%ef%bc%8creconnectmysq","status":"publish","type":"post","link":"https:\/\/itmax.cn\/?p=10020836","title":{"rendered":"\u6ce8\u610f\u907f\u5751\uff0cpeewee \u76f4\u63a5\u64cd\u4f5c db \u5bf9\u8c61\u8fd0\u884c\u539f\u751f sql \u7684\u65f6\u5019\uff0cReconnectMySQLDatabase  \u4f1a\u5931\u6548"},"content":{"rendered":"<blockquote><p>\u6ce8\u610f\u907f\u5751\uff0cpeewee \u76f4\u63a5\u64cd\u4f5c db \u5bf9\u8c61\u8fd0\u884c\u539f\u751f sql \u7684\u65f6\u5019\uff0cReconnectMySQLDatabase  \u4f1a\u5931\u6548 \uff0c\u6bd4\u5982 with db.cursor() as cursor<\/p><\/blockquote>\n<p>\u6211\u4f7f\u7528 ReconnectMixin \u548c MySQLDatabase \u6784\u5efa\u4e86\u4e00\u4e2a ReconnectMySQLDatabase \u6765\u5b9e\u73b0 mysql \u7684\u65ad\u8fde\u4e0b\u7684\u81ea\u52a8\u91cd\u8fde<\/p>\n<pre><code class=\"python\">import peewee\nfrom peewee import Model, MySQLDatabase\nfrom peewee import CharField, IntegerField, DateTimeField, AutoField, DateField\nfrom peewee import BooleanField, SmallIntegerField, TextField\nfrom peewee import SQL\nimport settings\nfrom playhouse.shortcuts import ReconnectMixin\n\n\nclass ReconnectMySQLDatabase(ReconnectMixin, MySQLDatabase):\n    pass\n\n\ndb = ReconnectMySQLDatabase(\n    database=settings.MYSQL_TKDB_CONFIG.database_name,\n    host=settings.MYSQL_TKDB_CONFIG.host,\n    port=settings.MYSQL_TKDB_CONFIG.port,\n    user=settings.MYSQL_TKDB_CONFIG.username,\n    password=settings.MYSQL_TKDB_CONFIG.password,\n    charset='utf8mb4'\n)<\/code><\/pre>\n<p>\u4e0a\u9762\u7684\u4ee3\u7801\u5728\u4f7f\u7528 orm \u7684\u539f\u751f\u5199\u6cd5\u7684\u65f6\u5019\uff0c\u6ca1\u6709\u95ee\u9898<\/p>\n<pre><code class=\"python\"># \u53ef\u4ee5\u5b9e\u73b0\u81ea\u52a8\u91cd\u8fde\nSeriesTable.select().where(\n    SeriesTable.status == status)<\/code><\/pre>\n<p>\u4f46\u662f\u8981\u6ce8\u610f\u7684\u662f\uff0c\u5982\u679c\u4f7f\u7528 db \u5bf9\u8c61\u76f4\u63a5\u53bb\u64cd\u4f5c sql\uff0c\u90a3\u5c31\u4e0d\u4f1a\u91cd\u8fde\u4e86<\/p>\n<pre><code class=\"python\">from pymysql.cursors import Cursor\n\n\nsql = &quot;&quot;&quot;\nUPDATE xxxx s\nJOIN (\n    SELECT id\n    FROM xxxx\n    WHERE xxxx = 'xxxxx'\n    AND xxxxx = 'xxxxx'\n    LIMIT 500\n) AS limited_ids ON s.id = limited_ids.id\nSET s.xxxx = 'xxxxx'; \n&quot;&quot;&quot;\n\n# logger.debug(f'sql: {sql}')\n\nwith db.cursor() as cursor:\n    cursor: Cursor\n    cursor.execute(sql)\n    cursor.connection.commit()  # \u8fd9\u91cc\u5fc5\u987b\u8981\u63d0\u4ea4\uff0c\u4e0d\u7136\u6240\u6709\u7684\u67e5\u8be2\u90fd\u4f1a\u5904\u4e8e\u4e00\u4e2a\u4e8b\u52a1\u4e2d\n\n    affected = cursor.rowcount\n<\/code><\/pre>\n<p>\u4e0a\u9762\u76f4\u63a5\u6267\u884c sql \u7684\u4ee3\u7801\uff0c\u53ef\u80fd\u4f1a\u62a5\u9519\u5982\u4e0b\uff1a<\/p>\n<pre><code class=\"log\">    raise value.with_traceback(tb)\n  File &quot;\/usr\/local\/lib\/python3.11\/site-packages\/peewee.py&quot;, line 3322, in execute_sql\n    cursor.execute(sql, params or ())\n  File &quot;\/usr\/local\/lib\/python3.11\/site-packages\/pymysql\/cursors.py&quot;, line 153, in execute\n    result = self._query(query)\n             ^^^^^^^^^^^^^^^^^^\n  File &quot;\/usr\/local\/lib\/python3.11\/site-packages\/pymysql\/cursors.py&quot;, line 322, in _query\n    conn.query(q)\n  File &quot;\/usr\/local\/lib\/python3.11\/site-packages\/pymysql\/connections.py&quot;, line 562, in query\n    self._execute_command(COMMAND.COM_QUERY, sql)\n  File &quot;\/usr\/local\/lib\/python3.11\/site-packages\/pymysql\/connections.py&quot;, line 843, in _execute_command\n    raise err.InterfaceError(0, &quot;&quot;)\npeewee.InterfaceError: (0, '')<\/code><\/pre>\n<p>\u53c2\u8003\u6587\u7ae0\uff1a<\/p>\n<p><a href=\"https:\/\/segmentfault.com\/a\/1190000041661495\" target=\"_blank\" rel=\"noopener noreferrer\">peewee \u6267\u884c\u539f\u751f sql<\/a><\/p>\n<p><a href=\"https:\/\/segmentfault.com\/a\/1190000046660096\">https:\/\/segmentfault.com\/a\/1190000046660096<\/a><\/p>\n","protected":false},"excerpt":{"rendered":"<p>\u6ce8\u610f\u907f\u5751\uff0cpeewee \u76f4\u63a5\u64cd\u4f5c db \u5bf9\u8c61\u8fd0\u884c\u539f\u751f sql \u7684\u65f6\u5019\uff0cReconnectMySQLDataba [&hellip;]<\/p>\n","protected":false},"author":1,"featured_media":0,"comment_status":"open","ping_status":"open","sticky":false,"template":"","format":"standard","meta":{"_jetpack_memberships_contains_paid_content":false,"footnotes":""},"categories":[4],"tags":[],"class_list":["post-10020836","post","type-post","status-publish","format-standard","hentry","category-share"],"jetpack_sharing_enabled":true,"jetpack_featured_media_url":"","_links":{"self":[{"href":"https:\/\/itmax.cn\/index.php?rest_route=\/wp\/v2\/posts\/10020836","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/itmax.cn\/index.php?rest_route=\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/itmax.cn\/index.php?rest_route=\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/itmax.cn\/index.php?rest_route=\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/itmax.cn\/index.php?rest_route=%2Fwp%2Fv2%2Fcomments&post=10020836"}],"version-history":[{"count":0,"href":"https:\/\/itmax.cn\/index.php?rest_route=\/wp\/v2\/posts\/10020836\/revisions"}],"wp:attachment":[{"href":"https:\/\/itmax.cn\/index.php?rest_route=%2Fwp%2Fv2%2Fmedia&parent=10020836"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/itmax.cn\/index.php?rest_route=%2Fwp%2Fv2%2Fcategories&post=10020836"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/itmax.cn\/index.php?rest_route=%2Fwp%2Fv2%2Ftags&post=10020836"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}