Google Cloud Sql SQL Alchemy 不插入数据

问题描述 投票:0回答:1

我有一个 Google Cloud Sql Istance (Postgres),我正在尝试使用 Python 中的 SqlAlchemy 创建和插入数据 这是我的代码:

import os
import sqlalchemy
from google.cloud.sql.connector import Connector, IPTypes

db_user = os.environ["DB_USER"]  
db_pass = os.environ["DB_PASS"]  
db_name = os.environ["DB_NAME"]  
instance_connection_name = os.environ["INSTANCE_CONNECTION_NAME"]


# initialize Connector object
connector = Connector()



def getconn():
    with Connector() as connector:
        conn = connector.connect(
            instance_connection_name,
            "pg8000",
            user = db_user,
            password = db_pass,
            db = db_name,
            ip_type = IPTypes.PUBLIC
        )
        return conn


# create connection pool
pool = sqlalchemy.create_engine(
    "postgresql+pg8000://",
    creator=getconn,
    pool_size=20,
    max_overflow=2,
    pool_timeout=30,
    pool_recycle=1800
)

with pool.connect() as db_conn:
  # create ratings table in our sandwiches database
  db_conn.execute(
    sqlalchemy.text(
      "CREATE TABLE IF NOT EXISTS ratings "
      "( id SERIAL NOT NULL, name VARCHAR(255) NOT NULL, "
      "origin VARCHAR(255) NOT NULL, rating FLOAT NOT NULL, "
      "PRIMARY KEY (id));"
    )
  )
  # insert data into our ratings table
  insert_stmt = sqlalchemy.text(
      "INSERT INTO ratings (name, origin, rating) VALUES (:name, :origin, :rating)",
  )

  # insert entries into table
  db_conn.execute(insert_stmt, parameters={"name": "HOTDOG", "origin": "Germany", "rating": 7.5})
  db_conn.execute(insert_stmt, parameters={"name": "BÀNH MÌ", "origin": "Vietnam", "rating": 9.1})
  db_conn.execute(insert_stmt, parameters={"name": "CROQUE MADAME", "origin": "France", "rating": 8.3})

  # query and fetch ratings table
  results = db_conn.execute(sqlalchemy.text("SELECT * FROM ratings")).fetchall()

  # show results
  for row in results:
    print(row)

代码在控制台中运行良好并且没有错误,但是在数据库中我没有插入值的表。 有什么东西可以配置到谷歌云 sql 中吗? 如果我从命令行将 SQL 语句运行到 postgres,则该语句有效。

谢谢

sqlalchemy google-cloud-sql
1个回答
1
投票

@dev_ 看起来你在文档中发现了一个错误! SQLAlchemy v2.x.x 是随手提交的,这意味着必须调用

.commit()
将事务提交回数据库。

Add

db_conn.commit()
应该可以解决问题并让数据出现在数据库中。

代码看起来像:

with pool.connect() as db_conn:
  # create ratings table in our sandwiches database
  db_conn.execute(
    sqlalchemy.text(
      "CREATE TABLE IF NOT EXISTS ratings "
      "( id SERIAL NOT NULL, name VARCHAR(255) NOT NULL, "
      "origin VARCHAR(255) NOT NULL, rating FLOAT NOT NULL, "
      "PRIMARY KEY (id));"
    )
  )
  # commit transaction
  db_conn.commit()

  # insert data into our ratings table
  insert_stmt = sqlalchemy.text(
      "INSERT INTO ratings (name, origin, rating) VALUES (:name, :origin, :rating)",
  )

  # insert entries into table
  db_conn.execute(insert_stmt, parameters={"name": "HOTDOG", "origin": "Germany", "rating": 7.5})
  db_conn.execute(insert_stmt, parameters={"name": "BÀNH MÌ", "origin": "Vietnam", "rating": 9.1})
  db_conn.execute(insert_stmt, parameters={"name": "CROQUE MADAME", "origin": "France", "rating": 8.3})

  # commit transactions
  db_conn.commit()

  # query and fetch ratings table
  results = db_conn.execute(sqlalchemy.text("SELECT * FROM ratings")).fetchall()

  # show results
  for row in results:
    print(row)

我已提交 PR 以在文档中展示此更改:https://github.com/GoogleCloudPlatform/cloud-sql-python-connector/pull/686

© www.soinside.com 2019 - 2024. All rights reserved.