

pythonを用いてsqlite3へとデータベース保管しようとしているのですが、sqlite3のデータの追加の文で日付の入ったものを保管しようとしましたが、シンタックスエラーでうまくできません。  
どのようにすれば改善できるのか教えていただきたいです。

カラムはid(integer型)とdate(text型)です。  
よろしくお願い致します。

コードは現在このような感じになっています。

[code]

    import sqlite3
    from matplotlib import pyplot as plt
    import numpy as np
    import time
    import os
    import datetime
    import shutil
    
    x,y = np.loadtxt('exp-data.txt',delimiter=' ',unpack=True)
    plt.plot(x,y)
    
    os.chdir("/home/デスクトップ/uploader/public/uploads/user/avatar/1") #change directly
    
    plt.savefig('sample.png')
    
    time = datetime.datetime.now()
    newname = "{0:%Y-%m-%d-%H:%M:%S}.png".format(time)
    os.rename("sample.png", newname)
    
    newtitle = "{0:%Y-%m-%d-%H:%M:%S}".format(time)
    
    os.chdir("/home/ienaga/デスクトップ/uploader/db") #change directly
    connector = sqlite3.connect("development.sqlite3")
    
    sql = "insert into graph('1', newtitle) values"
    sql += "'"+str(newtitle)+"');"
    
    connector.execute(sql)
    
    connector.commit()
    connector.close()
    
[/code]

エラー内容を記入します

[code]

    Traceback (most recent call last):
      File "yomikomi01.py", line 28, in <module>
        connector.execute(sql)
    sqlite3.OperationalError: near "'2016-04-13-14:29:45'": syntax error
    
[/code]


CC BY-SA 3.0
2016-04-13T03:40:16.083
23979
2016-04-13T07:52:29.563
2016-04-13T05:34:27.410
13491
13491
question
python sqlite
pythonでsqlite3を使う際に変数に置き換える方法


以下でどうでしょう？

[code]

    connector.execute("insert into graph (newtitle) values (%s)", (newtitle,))
    
[/code]


CC BY-SA 3.0
2016-04-13T05:12:10.143
23980
2016-04-13T05:12:10.143
806
23979
answer


以下が間違っています。

[code]

    sql += "'"+str(newtitle)+"');"
    
[/code]

正しくは

[code]

    sql += "('"+str(newtitle)+"');"
    
[/code]

SQLのシンタックスエラーは作ったSQL文をログに出力する、もしくはコンソールに出力すると確認しやすいです。


CC BY-SA 3.0
2016-04-13T05:43:33.227
23981
2016-04-13T05:43:33.227
7214
23979
answer


「カラムはid(integer型)とdate(text型)です」と言うことなら、sqlの前半もおかしいんでは無いですかね。

[code]

    sql = "INSERT INTO graph(id,date) VALUES('1',?)"
    connector.execute(sql, [newtitle])  # 追記部分をご覧ください
    
[/code]

値を埋め込む時は直接SQL文を文字列として作らず`?`で埋め込んだ方が良いと思います。

* * *

(追記)  
上記のコードも一応手元の環境で動くことは確かめたものですが、コメントに書いていただいたように、ドキュメントでは`?`に対する値はtuple of
valuesで指定すると書かれていて、コード例も一貫してそれに合わせてあるので、2行目は次のように書いた方が良いと思われます。

[code]

    connector.execute(sql, (newtitle,))
    
[/code]


CC BY-SA 3.0
2016-04-13T06:07:09.093
23984
2016-04-13T07:52:29.563
2016-04-13T07:52:29.563
13972
13972
23979
answer