PostgreSQL 架构 "www" 不存在?
PostgreSQL Schema "www" does not exist?
根据 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)
如果这里的问题不明显,那就是 none 的值被引用了。这是正确引用的版本:
INSERT INTO main (info, text, date)
VALUES ('www.capecod.edu', 'test', '2015-09-12')
错误是由未引用的 www.capecod.edu
引起的。由于这些点,它被解释为 schema.table.column
.
"right" 方法是使用参数化查询。
query = "INSERT INTO main (info, text, date) VALUES (%s, %s, %s)"
params = (info, text, date)
sql.execute(query, params)
psycopg2 会弄清楚应该引用什么以及如何引用。与简单地自己插入字符串相比,这是一个更安全的选择,后者通常会让您面临 SQL 注入攻击。
http://initd.org/psycopg/articles/2012/10/01/prepared-statements-psycopg/
不幸的是,您不能将诸如 table 名称之类的标识符作为参数扔进去,因为它们会被引用为字符串值,这是错误的 SQL 语法。我找到了一个答案 (python adds "E" to string),它指向 psycopg2.extensions.AsIs
作为一种将标识符(例如 table 名称)作为参数安全传递的方法。不过,我无法在我的测试中完成这项工作。
如果您走 AsIs
路线,您应该谨慎检查 table 名称是否有效,如果它们以某种方式来自用户输入。像
valid_tables = ["main", "foo", "bar", "baz"]
if table not in valid_tables:
return False
根据 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)
如果这里的问题不明显,那就是 none 的值被引用了。这是正确引用的版本:
INSERT INTO main (info, text, date)
VALUES ('www.capecod.edu', 'test', '2015-09-12')
错误是由未引用的 www.capecod.edu
引起的。由于这些点,它被解释为 schema.table.column
.
"right" 方法是使用参数化查询。
query = "INSERT INTO main (info, text, date) VALUES (%s, %s, %s)"
params = (info, text, date)
sql.execute(query, params)
psycopg2 会弄清楚应该引用什么以及如何引用。与简单地自己插入字符串相比,这是一个更安全的选择,后者通常会让您面临 SQL 注入攻击。
http://initd.org/psycopg/articles/2012/10/01/prepared-statements-psycopg/
不幸的是,您不能将诸如 table 名称之类的标识符作为参数扔进去,因为它们会被引用为字符串值,这是错误的 SQL 语法。我找到了一个答案 (python adds "E" to string),它指向 psycopg2.extensions.AsIs
作为一种将标识符(例如 table 名称)作为参数安全传递的方法。不过,我无法在我的测试中完成这项工作。
如果您走 AsIs
路线,您应该谨慎检查 table 名称是否有效,如果它们以某种方式来自用户输入。像
valid_tables = ["main", "foo", "bar", "baz"]
if table not in valid_tables:
return False