给定表和列名称,如何测试INSERT是否需要围绕要插入的值的引号('')?

时间:2015-08-10 00:54:57

标签: python sql postgresql psycopg2

我有一个列名/值的字典,要插入表中。我有一个生成INSERT语句的函数。我被卡住了,因为函数总是在值周围加上引号,有些是整数。

e.g。如果第1列是整数类型,则该语句应为INSERT INTO myTable (col1) VALUES 5; vs INSERT INTO myTable (col1) VALUES '5';第二个导致错误,表示第5列不存在。

编辑:我发现了问题(我认为)。该值是双引号而不是单引号,因此它是"5"

在Python中,给定表和列名称,如何测试INSERT语句是否需要在''附近VALUES

4 个答案:

答案 0 :(得分:2)

此问题标有" psycopg2" - 您可以使用格式字符串准备语句,并在许多情况下为您提供psycopg2推断类型。

cur.execute('INSERT INTO myTable (col1, col2) VALUES (%s, %s);', (5, 'abc'))

psycopg2会为你处理它,因为Python知道5是一个整数而'abc'是一个字符串。

http://initd.org/psycopg/docs/usage.html#passing-parameters-to-sql-queries

答案 1 :(得分:1)

虽然我个人不喜欢这个想法,但是当你在Postgres中插入时,你可以在整数周围使用单引号。

也许你的问题是缺少括号:

INSERT INTO myTable(col1)
    VALUES('5');

Here是一个说明此代码的SQL小提琴。

正如您在评论中所述,双引号在Postgres中不起作用。

答案 2 :(得分:1)

您当然希望使用库函数来决定是否引用您插入的值。如果您要插入用户输入的任何内容,编写自己的引用功能可能会导致SQL Injection attacks

从您的代码中可以看出,您使用的是psycopg2 - 我发现another response可能能够回答您的问题,因为我不熟悉该库。主要的要点似乎是你应该使用

cursor.execute("query with params %s %s", ("param1", "pa'ram2"))

将自动处理param1和param2所需的任何引用。

答案 3 :(得分:0)

  1. 您可以随时输入单引号(请注意,如果值内容为引号,则必须加倍:insert into example (value_t) values ('O''Hara');
  2. 您可以决定检查要插入de destination类型的方面的值
  3. 您可以决定检查目标字段的类型
  4. 正如您在http://sqlfiddle.com/#!15/8bfbd/3中所看到的那样,无需在文本字段中插入整数或在数字字段中表示整数的字符串。

    要检查字段类型,您可以使用information_schema:

     select data_type from information_schema.columns 
       where table_schema='public'
         and table_name='example'
         and column_name='value_i';
    

    http://sqlfiddle.com/#!15/8bfbd/7