2

行を反復しながら行のIDを取得しようとしていますが、方法がわかりません。これが私が持っているものです。

cursor = conn.cursor()
cursor.execute("SELECT * FROM Logs {} ORDER BY created {} LIMIT 0, {}".format(created_filter, settings.order, settings.limit))

logs = list()
for row in cursor.fetchall():
    # I want to get the row id in here.

ここで、DB を作成して書き込みます。どうやら私の行IDを除いて、すべてが機能しています。

file = settings.logs_path
log_table_name = 'Logs'
pin_table_name = 'Pins'


conn = sqlite3.connect(file, check_same_thread=False)
c = conn.cursor()

log_schema = dict(rowid = 'INTEGER PRIMARY KEY AUTOINCREMENT',
            asctime = 'TEXT',
            created = 'REAL',
            exc_info = 'TEXT',
            exc_text = 'TEXT',
            filename = 'TEXT',
            funcName = 'TEXT',
            levelname = 'TEXT',
            levelno = 'INTEGER',
            lineno = 'INTEGER',
            module = 'TEXT',
            msecs = 'REAL',
            message = 'TEXT',
            msg = 'TEXT',
            name = 'TEXT',
            pathname = 'TEXT',
            process = 'INTEGER',
            processName = 'TEXT',
            relativeCreated = 'REAL',
            thread = 'INTEGER',
            threadName = 'TEXT')

pin_schema = dict(rowid = 'INTEGER PRIMARY KEY AUTOINCREMENT',
                pinnedId = 'INTEGER')

sql = 'CREATE TABLE IF NOT EXISTS ' + log_table_name + ' ({})'.format(','.join(log_schema))
c.execute(sql)
sql = 'CREATE TABLE IF NOT EXISTS ' + pin_table_name + ' ({})'.format(','.join(pin_schema))
c.execute(sql)
conn.commit()

def write_log(log):
    keys = [key for key in log_schema.keys() if key != 'rowid']
    values = []
    for key in keys:
        try:
            values.append(str(getattr(log, key)))
        except Exception:
            values.append('')
    parameters = ['?' for key in keys]
    c.execute("INSERT INTO Logs ({}) VALUES ({})".format(','.join(keys),','.join(parameters)), values)
    conn.commit()
4

1 に答える 1

2

CREATE TABLEコマンドにフィールド タイプがありません。ここで何が起こるかに注目してください:

In [27]: pin_schema = dict(rowid = 'INTEGER PRIMARY KEY AUTOINCREMENT',
                pinnedId = 'INTEGER')

In [30]: pin_table_name = 'Pins'

In [31]: sql = 'CREATE TABLE IF NOT EXISTS ' + pin_table_name + ' ({})'.format(','.join(pin_schema))

In [32]: sql
Out[32]: 'CREATE TABLE IF NOT EXISTS Pins (pinnedId,rowid)'

取得できるのは、フィールド タイプのないフィールド名だけです。代わりに、フィールドとフィールド タイプの両方を含む文字列のリストとしてpin_schemaとを定義するか、 を反復処理します。log_schemapin_schema.items()

sql = 'CREATE TABLE IF NOT EXISTS ' + pin_table_name + ' ({})'.format(
    ', '.join('{f} {t}'.format(f=field, t=field_type)
             for field, field_type in pin_schema.items()))

In [35]: sql
Out[35]: 'CREATE TABLE IF NOT EXISTS Pins (pinnedId INTEGER, rowid INTEGER PRIMARY KEY AUTOINCREMENT)'

rowidが自動インクリメントしなかった理由は、フィールド タイプがないことで説明できます。

于 2013-08-24T02:52:25.817 に答える