首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >使用内核2内置格式创建动态类型表。

使用内核2内置格式创建动态类型表。
EN

Stack Overflow用户
提问于 2019-06-12 22:05:24
回答 1查看 814关注 0票数 2

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

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

代码语言:javascript
复制
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')

并以一个名为“动物”的表结束,该表包含类型为VARCHAR的列"name“。但是,当我试图运行它时,我会得到一个错误:‘类型“"VARCHAR”不存在’。我想,当不应该有任何的VARCHAR类型时,内核2的内置格式化程序将双引号放在VARCHAR类型的周围。通常,我只需要自己处理这个问题,但是文档非常清楚,由于担心SQL注入攻击,因此不应该使用Python字符串连接。安全性是这个项目的一个关注点,所以我想知道是否有可能以这种方式使用pyscopg2创建动态类型的表,如果没有,是否还有另一个第三方API可以安全地这样做。谢谢!

丹尼

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2021-02-10 16:02:29

我在这方面也遇到了很多麻烦。sql.Identifier用于数据类型(INTEGERTEXT等)的双重引用的SQL标识符。都不是。看起来,只是简单地使用SQL就行了。

N.B.在您的代码中,您应该有预定义的columns元组,而不是将它们的定义暴露给前端。这也是为什么元组在这里是有用的,因为它们是不可变的。

代码语言:javascript
复制
import psycopg2.sql as sql

def create_table( name, columns ):
    # name = "mytable"
    # columns = (("col1", "TEXT"), ("col2", "INTEGER"), ...)
    fields = []
    for col in columns:
        fields.append( sql.SQL( "{} {}" ).format( sql.Identifier( col[0] ), sql.SQL( col[1] ) ) )

    query = sql.SQL( "CREATE TABLE {tbl_name} ( {fields} );" ).format(
        tbl_name = sql.Identifier( name ),
        fields = sql.SQL( ', ' ).join( fields )
    )
    print( query.as_string(conn) ) # CREATE TABLE "mytable" ( "col1" TEXT, "col2" INTEGER );
    # Get cursor and execute...
票数 4
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/56570952

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档