簡體   English   中英

在 Psycopg2 中查詢字符串組合

[英]Query String Composition in Psycopg2

我正在嘗試使用 Psycopg2 從 Python 在 Postgres 中運行 SQL“SELECT”查詢。 我正在嘗試編寫如下查詢字符串,但收到錯誤消息,使用 psycopg2 2.9 版。

from psycopg2 import sql

tablename = "mytab"
schema = "public"
query = sql.SQL("SELECT table_name from information_schema.tables where table_name = {tablename} and table_schema = {schema};")
query = query.format(tablename=sql.Identifier(tablename), schema=sql.Identifier(schema))
cursor.execute(query)
result = cursor.fetchone()[0]

錯誤:

psycopg2.error.InFailedSqlTransaction: current transaction is aborted, commands ignored until end of transaction block

有人可以幫忙嗎。 謝謝。

在(有點奇怪)查詢中

select table_name 
from information_schema.tables 
where table_name = 'mytab'
and table_schema = 'public';

'mytab''public'是文字,而不是標識符。 為了比較, mytab是這里的標識符:

select *
from mytab;

因此,您的format聲明應如下所示:

query = query.format(tablename=sql.Literal(tablename), schema=sql.Literal(schema))

請注意,引用的錯誤消息有些誤導,因為它是關於執行問題中顯示的查詢以外的查詢。

由於此查詢僅處理動態值,因此可以簡化為:

import psycopg2

con = psycopg2.connect(<params>)
cursor = con.cursor()

tablename = "mytab"
schema = "public"
# Regular placeholders
query = """SELECT 
    table_name 
from 
    information_schema.tables 
where 
    table_name = %s and table_schema = %s"""

cursor.execute(query, [tablename, schema])
result = cursor.fetchone()[0]

# Named placeholders
query = """SELECT 
    table_name 
from 
    information_schema.tables 
where 
    table_name = %(table)s and table_schema = %(schema)s"""

cursor.execute(query, {"table": tablename, "schema": schema})
result = cursor.fetchone()[0]

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM