Python PostgreSQL模式";www";不存在吗?

Python PostgreSQL模式";www";不存在吗?,python,postgresql,psycopg2,Python,Postgresql,Psycopg2,从PostgreSQL文档中可以看出,如果您在不指定模式的情况下执行插入,那么它应该是公共模式 出于某种原因,我看到了以下错误 psycopg2.ProgrammingError: schema "www" does not exist 您正在使用字符串插值来创建查询。这是psycopg2执行的操作: INSERT INTO main (info, text, date) VALUES (www.capecod.edu, test, 2015-09-12) 如果这里的错误不明显,那就

从PostgreSQL文档中可以看出,如果您在不指定模式的情况下执行插入,那么它应该是公共模式

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

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注入攻击

不幸的是,您不能将诸如表名之类的标识符作为参数抛出,因为它们被引用为字符串值,这是糟糕的SQL语法。我找到了一个答案(),指向
psycopg2.extensions.AsIs
,作为安全地将表名等标识符作为参数传递的方法。不过,在我的测试中,我没能做到这一点

如果您选择AsIs路径,则应谨慎检查表名是否有效,如果它们以某种方式来自用户输入。差不多

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

if table not in valid_tables:
    return False

您正在使用字符串插值来创建查询。这是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注入攻击

不幸的是,您不能将诸如表名之类的标识符作为参数抛出,因为它们被引用为字符串值,这是糟糕的SQL语法。我找到了一个答案(),指向
psycopg2.extensions.AsIs
,作为安全地将表名等标识符作为参数传递的方法。不过,在我的测试中,我没能做到这一点

如果您选择AsIs路径,则应谨慎检查表名是否有效,如果它们以某种方式来自用户输入。差不多

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

if table not in valid_tables:
    return False

您正在使用字符串插值来创建查询。这是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注入攻击

不幸的是,您不能将诸如表名之类的标识符作为参数抛出,因为它们被引用为字符串值,这是糟糕的SQL语法。我找到了一个答案(),指向
psycopg2.extensions.AsIs
,作为安全地将表名等标识符作为参数传递的方法。不过,在我的测试中,我没能做到这一点

如果您选择AsIs路径,则应谨慎检查表名是否有效,如果它们以某种方式来自用户输入。差不多

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

if table not in valid_tables:
    return False

您正在使用字符串插值来创建查询。这是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注入攻击

不幸的是,您不能将诸如表名之类的标识符作为参数抛出,因为它们被引用为字符串值,这是糟糕的SQL语法。我找到了一个答案(),指向
psycopg2.extensions.AsIs
,作为安全地将表名等标识符作为参数传递的方法。不过,在我的测试中,我没能做到这一点

如果您选择AsIs路径,则应谨慎检查表名是否有效,如果它们以某种方式来自用户输入。差不多

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

if table not in valid_tables:
    return False

这不符合书面要求。你必须自己插入字符串,因为psycopg2不知道它是一个标识符,而不是一个文字。@CraigRinger谢谢,我没听清楚。您可以将表名作为参数传入,实际上,您只需更加小心。。。我将编辑答案。在名称周围添加“”后,它似乎起作用了,只是我在表中没有看到条目?这是因为我需要始终使用params吗??或者日期需要是PostgreSQL样式而不是python样式?使用参数是可选的,但如果数据来自用户输入,则鼓励使用参数(以避免SQL注入攻击)。我不能说更多,除非看到你实际上做了什么-你把引号放在哪里了?你的新代码是什么?请用新的细节更新问题…有点奇怪,我正在做一个插入(“main”,“www.whoi.edu”,“test”)打印选择(“main”,“www.whoi.edu”),但我一个也没有。My query=“插入%s(url、文本、日期)值('%s','%s','%s')”%(表、url、文本、日期)这将无法按编写方式工作。您必须自己插入字符串,因为psycopg2不知道它是一个标识符而不是文字。@CraigRinger Tha