📜  SQLAlchemy 核心 - 更新语句

📅  最后修改于: 2022-05-13 01:55:21.530000             🧑  作者: Mango

SQLAlchemy 核心 - 更新语句

在本文中,我们将了解如何使用 SQLAlchemy 中的 UPDATE 语句对Python中的 PostgreSQL 数据库。

为演示创建表

从 SQLAlchemy 包中导入必要的函数。使用 create_engine()函数与 PostgreSQL 数据库建立连接,如下所示,创建一个名为 books 的表,其中包含 book_id 和 book_price 列。如图所示,使用 insert() 和 values()函数将记录插入表中。

Python3
# import necessary packages
from sqlalchemy.engine import result
import sqlalchemy
from sqlalchemy import create_engine, MetaData,
Table, Column, Numeric, Integer, VARCHAR, update
 
# establish connections
engine = create_engine(
    "database+dialect://username:password0@host:port/databasename")
 
# initialize the Metadata Object
meta = MetaData(bind=engine)
MetaData.reflect(meta)
 
# create a table schema
books = Table(
    'books', meta,
    Column('book_id', Integer, primary_key=True),
    Column('book_price', Numeric),
    Column('genre', VARCHAR),
    Column('book_name', VARCHAR)
)
 
meta.create_all(engine)
 
# insert records into the table
statement1 = books.insert().values(book_id=1,
                                   book_price=12.2,
                                   genre='fiction',
                                   book_name='Old age')
statement2 = books.insert().values(book_id=2,
                                   book_price=13.2,
                                   genre='non-fiction',
                                   book_name='Saturn rings')
statement3 = books.insert().values(book_id=3,
                                   book_price=121.6,
                                   genre='fiction',
                                   book_name='Supernova')
statement4 = books.insert().values(book_id=4,
                                   book_price=100,
                                   genre='non-fiction',
                                   book_name='History of the world')
statement5 = books.insert().values(book_id=5,
                                   book_price=1112.2,
                                   genre='fiction',
                                   book_name='Sun city')
 
# execute the insert records statement
engine.execute(statement1)
engine.execute(statement2)
engine.execute(statement3)
engine.execute(statement4)
engine.execute(statement5)


Python3
# Get the `books` table from the Metadata object
BOOKS = meta.tables['books']
 
# update
u = update(BOOKS)
u = u.values({"book_name": "2022 future ahead"})
u = u.where(BOOKS.c.book_id == 3)
engine.execute(u)
 
 
# write the SQL query inside the
# text() block to fetch all records
sql = text("SELECT * from BOOKS")
 
# Fetch all the records
result = engine.execute(sql).fetchall()
 
# View the records
for record in result:
    print("\n", record)


Python3
# Get the `books` table from the Metadata object
BOOKS = meta.tables['books']
 
# update
stmt = BOOKS.update().where(BOOKS.c.genre == 'non-fiction'
                           ).values(genre = 'sci-fi')
engine.execute(stmt)
 
# write the SQL query inside the
# text() block to fetch all records
sql = text("SELECT * from BOOKS")
 
# Fetch all the records
result = engine.execute(sql).fetchall()
 
# View the records
for record in result:
    print("\n", record)


Python3
# Get the `books` table from the Metadata object
BOOKS = meta.tables['books']
 
# update
stmt = BOOKS.update().where(BOOKS.c.book_price <= 100
                           ).values(book_price= BOOKS.c.book_price + 50)
engine.execute(stmt)
 
# write the SQL query inside the
# text() block to fetch all records
sql = text("SELECT * from BOOKS")
 
# Fetch all the records
result = engine.execute(sql).fetchall()
 
# View the records
for record in result:
    print("\n", record)


输出:

样品表

实现查询以更新 SQLAlchemy 中的表元素

示例 1:查询更新表

更新表元素的过程与常规 SQL 查询的过程略有不同,如下所示

from sqlalchemy import update
upd = update(tablename)
val = upd.values({"column_name":"value"})
cond = val.where(tablename.c.column_name == value)

从连接到数据库时初始化的元数据对象获取书籍表。将更新查询传递给 execute()函数并使用 fetchall()函数获取所有结果。使用 for 循环遍历结果。

下面代码中显示的 SQLAlchemy 查询将第 3 行的书名更新为“2022 future ahead”。然后,我们可以编写一个常规的 SQL 查询并使用 fetchall() 打印结果来检查表是否正确更新。

Python3

# Get the `books` table from the Metadata object
BOOKS = meta.tables['books']
 
# update
u = update(BOOKS)
u = u.values({"book_name": "2022 future ahead"})
u = u.where(BOOKS.c.book_id == 3)
engine.execute(u)
 
 
# write the SQL query inside the
# text() block to fetch all records
sql = text("SELECT * from BOOKS")
 
# Fetch all the records
result = engine.execute(sql).fetchall()
 
# View the records
for record in result:
    print("\n", record)

输出:

更新查询的结果。

示例 2:根据值更新表的查询

让我们看另一个与更新查询相关的示例。下面显示的更新查询将类型小说更新为“科幻”。

Python3

# Get the `books` table from the Metadata object
BOOKS = meta.tables['books']
 
# update
stmt = BOOKS.update().where(BOOKS.c.genre == 'non-fiction'
                           ).values(genre = 'sci-fi')
engine.execute(stmt)
 
# write the SQL query inside the
# text() block to fetch all records
sql = text("SELECT * from BOOKS")
 
# Fetch all the records
result = engine.execute(sql).fetchall()
 
# View the records
for record in result:
    print("\n", record)

输出:

更新查询的输出

示例 3:根据 Condition 查询更新表

下面的查询通过向小于或等于 100 的书籍添加 50 美元来更新 book_price。

Python3

# Get the `books` table from the Metadata object
BOOKS = meta.tables['books']
 
# update
stmt = BOOKS.update().where(BOOKS.c.book_price <= 100
                           ).values(book_price= BOOKS.c.book_price + 50)
engine.execute(stmt)
 
# write the SQL query inside the
# text() block to fetch all records
sql = text("SELECT * from BOOKS")
 
# Fetch all the records
result = engine.execute(sql).fetchall()
 
# View the records
for record in result:
    print("\n", record)

输出:

更新查询的输出