2011-01-31 12 views
-1

私はNokia N810上でtclSqliteを実行することができないので、私はPythonにtclスクリプトを移植しています。スクリプトは、入力を求めるプロンプトを表示し、Notes、Tags、およびNotesXTags多対多tblの3つのテーブルを持つsqlite DBに渡します。私は何度も何度もタグを保存しないようにするトリガがあります。ノブ/愛好家である私は、tclスクリプトを通してそれぞれをPythonの行に置き換えて一行ずつ行った。あまりPythonicではありませんが、私はこのスクリプトをN810で動作させた後に、その言語を使用するつもりのない愛好家です。私はすべてのQを見ました& S.O.私はこれを何時間も働いてきました。私は少なくとも3つのバグを知っている。 「pythonmakenote.py」と呼ばれるモジュール内のスクリプトのチャンク:tty Python Sqliteアプリケーション:Noob NameError、予期しないEOF、sqliteエラー

クランチ・バン...といくつかのコメント....だから、私は「輸入pythonmakenote

import sys, tty 
import sqlite3 

def mn(): 
    conn = sqlite3.connect('/home/j...notes.sqlite') 
    db = conn.cursor() 
tagsofar =db.execute('select tag_text from tag') 
print tagsofar 

print "Enter note text, remember to let console wrap long lines" 
notetxt = input("note: ") 

print "Enter 1 or more tags separated by spaces" 
taglist = input("tags: ") 
taglist = taglist.split(" ") 

db.execute('INSERT INTO note (note_txt) VALUES (?)', notetxt) 
db.commit 
fknote = db.execute('select last_insert_rowid()') 

#records new tags since db trigger stops dups, updates many-many tbl 

for tagtxt in taglist: 
    db.execute('INSERT INTO tag VALUES (?)',tagtxt) 
    db.commit 
    fktag = db.execute('select rowid from tag where tag_text = (?)',tagtxt) 
    db.execute('INSERT INTO fkeys VALUES (?,?)',fknote,fktag) 
    db.commit 
'ここまでは順調ですね。私は「MN」を入力し、エラーが表示されます。

>>> mn 
Traceback (most recent call last): 
    File "<stdin>", line 1, in <module> 
NameError: name 'mn' is not defined 

は、その後、私はこれを試してみてください。

>>> from pythonmakenote import mn 
>>> mn 
<function mn at 0xb76b2a74> 

しかし、「MN」はまだ動作しません。だから私は...作品ソートの世界でS.O.ある

>>> import mn 
<sqlite3.Cursor object at 0xb75fb740> 
Enter note text, remember to let console wrap long lines 
note: 'this is a note'<--------------------------Quotes are a MUST (but not in tcl version) 
Enter 1 or more tags separated by spaces 
tags: 'dev' 
Traceback (most recent call last): 
    File "<stdin>", line 1, in <module> 
    File "mn.py", line 19, in <module> 
    db.execute('INSERT INTO note (note_txt) VALUES (?)', notetxt) 
sqlite3.ProgrammingError: Incorrect number of bindings supplied. The current statement uses 1, and there are 14 supplied.<-----------------------------Huh? 

を完全にデフを削除し、ファイルをコピーして、「mn.py」という名前を付け、それコードブロックタグや他のマークダウンに関する指示?

なぜモジュールでmnを定義して使用できないのですか? Python: NameError: global name 'foobar' is not definedは関係していますか?

タグでメモを取ったり、タグリストを取得したりするためにいくつかのデフがありました。私はそれらがすべて1つのモジュールに入ると思っていました。

私の入力(メモまたはスペースで区切られたタグリスト)の周りに引用符を入れたくありません。それは実践ですか?私はそこにインポートttyものがありますが、私はそれを使用していません(どのようにはわかりませんが、私は学ばなければならないと思っています)

私は3つのタグを入力すると、 、私は '予期しないEOF'エラーが発生します。どうして?

文字列が不変なので、リスト/ splitを以前に文字列だったvarに割り当てるのは問題がありますか?

sqliteはどこで '14'バインディングを取得しますか?私はスペースの文字を分割していますが、無視されています(私は間違っているので)。

私の小さなプロジェクトをBashで行うのは簡単でしょうか?

これまでに時間を費やす人に感謝します。私は、S.U.のトピックではない分野で助けが必要な習慣がありません。ここではnoob-RTFMもあります。私はtclバージョンで少し苦労しましたが、今はチャンピオンのように機能します。私はPythonがやや簡単だと思っていました。それはまだかもしれないと思う。

編集:WOW。たくさんの改行が取り除かれました。申し訳ありませんが修正する方法がわかりません。私は "raw_input"がうまく動作するかどうか確認しません。

答えて

2

inputの代わりにraw_inputがスクリプトに必要です。inputは入力する内容を評価します。そのため、引用符を入力する必要があります。

あなたは、入力ウィンドウ上の{}ボタンを使用してコードをマークダウンすることができます。コードの実際のマークダウンは、先行する4スペースです。

db.commitdb.commit()する必要があります。

あなたがこれを行う場合:

>>> import pythonmakenote 

これを実行MN行うには:

>>> pythonmakenote.mn() 

をあなたも行うことができます。

db.execute('INSERT INTO note (note_txt) VALUES (?)', notetxt) 
:のようなラインのための

>>> from pythonmakenote import mn 
>>> mn() 

あなたは必要です(これは14文字の文字列だった)

db.execute('INSERT INTO note (note_txt) VALUES (?)', (notetxt,)) 

executeは、シーケンスを期待するので、あなたは文字列を渡した場合、それはあなたの14 bindingsエラーしたがって、単一の文字列として機能します。 (xxx,)は、1要素タプルの構文です。それをリスト[xxx]にすることもできます。

はここで働く何かで私の最高の推測です。私はあなたのデータベースを持っていません:

import sys 
import sqlite3 

def mn(): 
    conn = sqlite3.connect('data.db') 
    db = conn.cursor() 
    db.execute('select tag_text from tag') 
    tagssofar = db.fetchall() 
    print tagssofar 

    print "Enter note text, remember to let console wrap long lines" 
    notetxt = raw_input("note: ") 

    print "Enter 1 or more tags separated by spaces" 
    taglist = raw_input("tags: ") 
    taglist = taglist.split() 

    db.execute('INSERT INTO note (note_txt) VALUES (?)', [notetxt]) 
    conn.commit() 
    db.execute('select last_insert_rowid()') 
    fknote = db.fetchone()[0] 
    print fknote 

    #records new tags since db trigger stops dups, updates many-many tbl 

    for tagtxt in taglist: 
     db.execute('INSERT INTO tag VALUES (?)',[tagtxt]) 
     conn.commit() 
     db.execute('select rowid from tag where tag_text = (?)',[tagtxt]) 
     fktag = db.fetchone()[0] 
     print fktag 
     db.execute('INSERT INTO fkeys VALUES (?,?)',[fknote,fktag]) 
     conn.commit() 
+0

Thanks Markは、モジュール/名前の全体の事を間違いなく解決します。私は毎回それを入力しなければならないので、私はモジュール名を短縮するでしょう! raw_input、quoted、さらには三重引用符でさえ、sqliteはnotetxtのすべての文字を束縛として数えています。変数の受け渡しには別の表記法があると思います。それを見つけるためにオフ。再度、感謝します。 - ジェイ – klausnrooster

+1

私の最後の編集を見ましたか? 'notetxt'の代わりに' [notetxt] 'または'(notetxt、) 'を渡してください。 –

+0

マークは、私はあなたに気づくには余りにも眠くなっている必要がありますが完全にあらゆる面でITを解決しよう!ありがとうございます - ジェイ – klausnrooster

1

ここではいくつかのことが起こっています。あなたはcで行われたときので、あなたが呼ぶだろう

>>> def mn(): 
...  conn = sqlite3.connect('tester.db') 
...  cur = conn.cursor() 
...  return cur 
... 
>>> c = mn() 

これは、接続を開いたままに、::まず、mnは何も返さない、あなたのような何かをしたいと思う。また

>>> c.connection.close() 

、上で実行しますカーソルがあなたには、いくつかのfetch方法、すなわちfetchoneまたはfetchallを呼び出す必要があり、何も返しません。これらのいくつかをまとめると、次のように変更され始めます。

import sys, tty 
import sqlite3 

def mn(): 
    conn = sqlite3.connect('/home/j...notes.sqlite') 
    cur = conn.cursor() 
    return cur 

db = mn() 

tags_so_far = db.execute('select tag_text from tag').fetchall() 

print tags_so_far 

print "Enter note text, remember to let console wrap long lines \n" 
notetxt = raw_input("note: ") 

print "Enter 1 or more tags separated by spaces \n" 
taglist = raw_input("tags: ").split() 

db.execute('INSERT INTO note (note_txt) VALUES (?)', notetxt) 
db.commit() 

fknote = db.execute('select last_insert_rowid()').fetchone()[0] 

#records new tags since db trigger stops dups, updates many-many tbl 

for tagtxt in taglist: 
    db.execute('INSERT INTO tag VALUES (?)', (tagtxt,)) 
    db.commit() 
    fktag = db.execute('select rowid from tag where tag_text = (?)',tagtxt) 
    db.execute('INSERT INTO fkeys VALUES (?,?)',fknote,fktag) 
+0

ありがとう、bvmou。フェッチすると、実際にはtags_so_farが取得され、画面に表示されます。パラメータ置換はちょうど(ここでは、SQLインジェクションのリスクをされていない)私は、文字列の連結のいずれかでプロトタイプを作成していますので、働いていないか、またはリテラルとちょうどテストします。私はfetchone()[1]([0]は私のデータベースでは自立型のROWIDとなるでしょう)、正しい添字であることを願っています。ありがとう。見つけられる前にしばらく時間を置いてください。litet notetxtでもsqliteの実行エラーが発生します。あなたとマークの間で、私は十分なブーストを得たと思う。私は両方のあなたの答えを「受け入れる」ことができたらいいと思う。私は次の日没をチェックします! – klausnrooster

+0

ああ、何かを返すように、私はそれが成功の旗を返すことができたと思うが、私はそれをどうするのか分からない。試してみようと思っています。私のアプローチは、機能的なものよりStatement/Procedureの方が多かった。私はこのことを小さな塊に分解しなければならないと思いますか?もう一度Markとbvmouに感謝します。 – klausnrooster

+0

...マークはfetchone()の[0]の添え字が正しいです - 私は[1]を使う必要はありません、私は自律配列のROWIDのためにオフセットしなければならないと思っていました。他の4つまたは5つの機能を実行するのを待つことはできません。 - ジェイ – klausnrooster

関連する問題