2

Firstname、、、およびボタンLastNameを持つ html フォームがあります。フォームにデータを入力すると、それが Berkeelys db に入ります。私のコードが行うことは、最後の値のみを出力することです。特定のキーに関連するすべての値を表示する必要がありますAgeGenderADD

#!/usr/bin/python

import bsddb
import cgi

form = cgi.FieldStorage()

print "Content-type:text/html\n"
Fname = form.getvalue('firstname', '')
Lname = form.getvalue('lastname', '')
Age = form.getvalue('age', 0)
Gender = form.getvalue('gender', '')

#print Fname, Lname, Age 

db = bsddb.hashopen("/home/neeraj/public_html/database/mydb.db","w")
db['FirstName'] = Fname  
db['LastName'] = Lname
db['Age'] = Age 
db['Gender'] = Gender
db.close()
db = bsddb.hashopen("/home/neeraj/public_html/database/mydb.db","r")
#db = bsddb.hashopen("/home/neeraj/public_html/database/mydb.db")
print db['FirstName'], db['LastName'], db['Age'], db['Gender']
db.close()
print db 
4

5 に答える 5

2

dictSQL データベースはすでにテーブル内の複数のタプルを処理しているため、 に基づくインターフェイスの代わりに SQL データベースを使用する必要があります。

とにかく、dictインターフェイスが必要な場合は、shelveモジュールを使用して(bsddb廃止予定なので、避ける必要があります)、各値を次のように保存できますlist

import shelve

COLUMNS = ('FirstName', 'LastName', 'Age', 'Sex')

the_db = shelve.open('test.db', writeback=True)
for col_name in COLUMNS:
    if col_name not in the_db:
        the_db[col_name] = []

records = [
    ('John', 'Deer', 20, 'M'),
    ('Ada', 'Lovelace', 23, 'F'),
]

for record in records:
    for col_name, value in zip(COLUMNS, record):
        the_db[col_name].append(value)

the_db.close()

the_db = shelve.open('test.db')

for record in zip(*(the_db[col_name] for col_name in COLUMNS)):
    print(record)

the_db.close()

上記のコードは次を出力します。

('John', 'Deer', 20, 'M')       
('Ada', 'Lovelace', 23, 'F')

sqlite3SQL データベースを使用する場合は、モジュールを使用できます。例えば:

import sqlite3

conn = sqlite3.connect('test.sqlite')

cursor = conn.cursor()

cursor.execute('''
CREATE TABLE people (
    FirstName text,
    LastName text,
    Age int,
    Sex text
    )''')

cursor.execute('''
INSERT INTO people values ('John', 'Deer', 20, 'M')''')

cursor.execute('''
INSERT INTO people values ('Ada', 'Lovelace', 23, 'F')''')

conn.commit()

for record in cursor.execute('''SELECT * FROM people'''):
    print(record)

上記のコードは次を出力します。

(u'John', u'Deer', 20, u'M')
(u'Ada', u'Lovelace', 23, u'F')

(単に文字列がユニコードであることを意味することに注意してください。u'...'値は変更されません)

ただし、このコードにはいくつかの問題があります (たとえば、2 回実行しようとするなど)。しかし、このパスをたどりたい場合は、最初に SQL を学習する必要w3schoolsがあります。もの)。

于 2013-11-09T11:12:58.343 に答える
0

オプションで毎回データベースを開くと、毎回w上書きし、最後のエントリのみを保存していると思います。代わりに を使用する必要がありますa

db = bsddb.hashopen("/home/neeraj/public_html/database/mydb.db","a")

公式の Python マニュアルから抜粋 -->

    open() returns a file object, and is most commonly used with two arguments:
    open(filename, mode).

f = open('workfile', 'w') 最初の引数は、ファイル名を含む文字列です。2 番目の引数は、ファイルの使用方法を説明するいくつかの文字を含む別の文字列です。モードは、ファイルが読み取り専用の場合は 'r'、書き込み専用の場合は 'w' (同じ名前の既存のファイルは消去されます)、'a' は追加用にファイルを開きます。ファイルに書き込まれたデータは、自動的に末尾に追加されます。

于 2013-11-09T07:52:34.913 に答える
0

正解は、このような場合には BDB を使用しないことです。単純なアプリケーションの場合、python 2.5 で最初に導入された組み込みのsqliteモジュールを使用できます。

于 2013-11-09T09:30:27.297 に答える