python - PostgreSQL 架构 "www"不存在?

标签 python postgresql psycopg2

根据 PostgreSQL 文档,如果您在未指定架构的情况下执行 INSERT,则它应该是一个公共(public)架构。​​

conn = psycopg2.connect(dbname = 'orion',
                host = 'localhost',
                port = 5432,
                user = 'earthling',
                password = 'mysupersecretpassword') 
sql = conn.cursor()

def INSERT(table, info, text):
    date = datetime.date.today()
    query = "INSERT INTO %s (info, text, date) " \
        "VALUES (%s, %s, %s)" %(table, info, text, date)
    sql.execute(query)

INSERT("main", "www.capecod.edu", "test")

出于某种原因,我看到了以下错误?

psycopg2.ProgrammingError: schema "www" does not exist

最佳答案

您正在使用字符串插值来创建查询。这是 psycopg2 执行的:

INSERT INTO main (info, text, date)
    VALUES (www.capecod.edu, test, 2015-09-12)

如果这里的问题不是很明显,那就是没有引用任何值。这是正确引用的版本:

INSERT INTO main (info, text, date)
    VALUES ('www.capecod.edu', 'test', '2015-09-12')

错误是由未加引号的 www.capecod.edu 引起的。由于这些点,它被解释为 schema.table.column

执行此操作的“正确”方法是使用参数化查询。

query = "INSERT INTO main (info, text, date) VALUES (%s, %s, %s)"
params = (info, text, date)
sql.execute(query, params)

psycopg2 会弄清楚应该引用什么以及如何引用。与简单地自己插入字符串相比,这是一个更安全的选择,后者通常会让您容易受到 SQL 注入(inject)攻击。

http://initd.org/psycopg/articles/2012/10/01/prepared-statements-psycopg/

不幸的是,您不能只将标识符(例如表名)作为参数扔进去,因为它们会作为字符串值被引用,这是糟糕的 SQL 语法。我找到了一个答案 ( python adds "E" to string ),它指向 psycopg2.extensions.AsIs 作为将标识符(例如表名)作为参数安全传递的方法。不过,我无法在我的测试中完成这项工作。

如果您选择 AsIs 路线,您应该谨慎检查表名是否有效,如果它们以某种方式来自用户输入。有点像

valid_tables = ["main", "foo", "bar", "baz"]

if table not in valid_tables:
    return False

关于python - PostgreSQL 架构 "www"不存在?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/32545985/

相关文章:

python - 通过 FTP 确定列表是 Python 中的目录还是文件

postgresql - 如果我需要查询(WHERE)列的任意组合,我应该将它们全部索引吗?

python - pip 安装 psycopg2 - 错误 : command 'x86_64-linux-gnu-gcc' failed with exit status 1

php - 检索行数并在没有行时返回 0

django/postgres : Transaction managed block ended with pending COMMIT/ROLLBACK

Python 和 psycopg2 对大数据集的多处理性能

python - Flask 服务器端表单 POST

python - 终端关闭时应用程序关闭,如何停止?

python - 自动初始化实例变量?

sql-server - SQL Server 和 Oracle 等产品是 "ORDBMS"的示例吗?