質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.51%
PostgreSQL

PostgreSQLはオープンソースのオブジェクトリレーショナルデータベース管理システムです。 Oracle Databaseで使われるPL/SQLを参考に実装されたビルトイン言語で、Windows、 Mac、Linux、UNIX、MSなどいくつものプラットフォームに対応しています。

Python 3.x

Python 3はPythonプログラミング言語の最新バージョンであり、2008年12月3日にリリースされました。

Q&A

解決済

2回答

9458閲覧

pythonからpostgresSQL呼び出しての変数を利用したテーブルへのデータ挿入

hotty4782

総合スコア27

PostgreSQL

PostgreSQLはオープンソースのオブジェクトリレーショナルデータベース管理システムです。 Oracle Databaseで使われるPL/SQLを参考に実装されたビルトイン言語で、Windows、 Mac、Linux、UNIX、MSなどいくつものプラットフォームに対応しています。

Python 3.x

Python 3はPythonプログラミング言語の最新バージョンであり、2008年12月3日にリリースされました。

0グッド

0クリップ

投稿2016/08/30 03:28

###前提・実現したいこと
pythonからpostgresSQL呼び出し、変数で定義されたデータをテーブルに挿入したい。

###発生している問題・エラーメッセージ
pythonからpostgresSQL呼び出し、変数で定義されたデータをテーブルに挿入したいのですが、
以下のエラーが出ました。
先日こちらのサイトにテーブル作成時に同じような問題で詰まった時に、迅速な回答を頂きとても助かりました。その時の回答を参考にしてコードを書いたのですが、また詰まってしまいました。

psycopg2.ProgrammingError: 列"test"は存在しません。 LINE1:...T INTO TEST_TABLE (filename, data1, data2) VALUES(test, data....)

###該当のソースコード
conn = psycopg2.connect("dbname=postgres host=localhost user=postgres password=test")
cur = conn.cursor()

tablename = "TEST_TABLE" filename = "test" indata1 = "data1" indata2 = "data2" sql = "CREATE TABLE %s (filename varchar, data1 varchar, data2 varchar);" % tablename cur.execute(sql) sql = "INSERT INTO %s (filename, data1, data2) VALUES(%s, %s ,%s);" % (tablename, filename, indata1, indata2) cur.execute(sql)

###試したこと
課題に対してアプローチしたことを記載してください

###補足情報(言語/FW/ツール等のバージョンなど)

より詳細な情報

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

guest

回答2

0

ベストアンサー

質問に記載されている書き方だと、変数sqlでクエリが構築し終わっていていて、testというカラムを見に行こうとしてしまっているのだと思います。
対応としては2個をほど挙げられます。

    1. sqlの元の時点で,'を使って明示的に文字列になるようにする
    1. クエリにプレースホルダーを用いて後から変数として渡す

1.の例

python

1sql = "INSERT INTO %s (filename, data1, data2) VALUES('%s', '%s' ,'%s');" % (tablename, filename, indata1, indata2) 2cur.execute(sql)

こうすることで、'test'という文字列を渡せます

2. の例

psycopg2 だと、以下のような形でプレースホルダーを扱えるみたいです。

python

1sql = "INSERT INTO TEST_TABLE (filename, data1, data2) VALUES(%s, %s ,%s);" 2cur.execute(sql, (filename, indata1, indata2))

投稿2016/08/30 04:23

attakei

総合スコア2738

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

hotty4782

2016/08/30 09:24

ご回答ありがとうございます。無事に解決しました。
guest

0

推測ですが
VALUES(%s, %s ,%s); でリテラル値でないためVALUES(testと展開されてtestが項目と見なされたのでは無いでしょうか?
pythonを良く知らないので、他言語では'%s'みたいなコーディングになります。

投稿2016/08/30 03:55

A.Ichi

総合スコア4070

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

hotty4782

2016/08/30 09:23

ご回答ありがとうございます。無事に解決しました。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.51%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問