Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/sql/79.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 使用psycopg2'创建动态类型表;s内置格式_Python_Sql_Psycopg2 - Fatal编程技术网

Python 使用psycopg2'创建动态类型表;s内置格式

Python 使用psycopg2'创建动态类型表;s内置格式,python,sql,psycopg2,Python,Sql,Psycopg2,我正在用Python开发一个与PostgreSQL数据仓库交互的项目,我正在使用PsycopG2API。我希望创建动态类型的表 例如:我希望能够执行以下代码: from psycopg2 import connect, sql connection = connect(host="host", port="port", database="database", user="user", password="pw") def create_table(tbl_name, col_name, c

我正在用Python开发一个与PostgreSQL数据仓库交互的项目,我正在使用PsycopG2API。我希望创建动态类型的表

例如:我希望能够执行以下代码:

from psycopg2 import connect, sql

connection = connect(host="host", port="port", database="database", user="user", password="pw")

def create_table(tbl_name, col_name, col_type):
    query = sql.SQL("CREATE TABLE {} ({} {})".format(sql.Identifier(tbl_name), sql.Identifier(col_name), sql.Identifier(column_type)))
    connection.execute(query)

create_table('animals', 'name', 'VARCHAR')
最后是一个名为“animals”的表,其中包含一个VARCHAR类型的“name”列。然而,当我尝试运行此程序时,我得到一个错误:“类型“VARCHAR”不存在”。我假设psycopg2的内置格式化程序在VARCHAR类型周围加上了双引号,而实际上不应该有双引号。通常情况下,我会自己解决这个问题,但文档中非常清楚,由于担心SQL注入攻击,绝不应该使用Python字符串连接。安全性是这个项目的一个关注点,所以我想知道是否可以使用pyscopg2以这种方式创建动态类型表,如果不可以,是否存在另一个第三方API可以安全地这样做。谢谢大家!


丹尼

我在这方面也遇到了很多麻烦
sql.Identifier
表示数据类型(
INTEGER
TEXT
等)不包含的双引号sql标识符。看起来简单的SQL就可以做到这一点

N.B.在代码中,应该有预定义的
元组,并且不要将它们的定义公开给前端。这也是为什么元组在这里很有用,因为它们是不可变的

将psycopg2.sql导入为sql
def create_表格(名称、列):
#name=“mytable”
#列=((“col1”,“TEXT”),(“col2”,“INTEGER”),…)
字段=[]
对于列中的列:
fields.append(sql.sql(“{}{}”).format(sql.Identifier(col[0]),sql.sql(col[1]))
query=sql.sql(“创建表{tbl_name}({fields});”).format(
tbl_name=sql.Identifier(名称),
fields=sql.sql(“,”).join(字段)
)
打印(query.as_string(conn))#创建表“mytable”(“col1”文本,“col2”整数);
#获取游标并执行。。。

@juanpa.arrivillaga您能详细说明一下吗?在psycopg2指南()中,以下代码(包含.format)被列为正确使用:
cur.execute(SQL(“插入到{}值(%s)”).format(标识符('numbers'),(10,)
correct@juanpa.arrivillaga好的,谢谢你的澄清。你对我最初的问题有进一步的了解吗?我在这里真的不知所措,需要任何想法。非常感谢。