我有一个 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,则该语句有效。
谢谢
@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