索引器错误:元组索引超出范围首次创建aa sqlite数据库

2024-10-03 09:20:58 发布

您现在位置:Python中文网/ 问答频道 /正文

问题

(我不得不删除并重新制作这个问题,因为有人把我的问题编辑得太离奇了,我无法编辑它以获得任何帮助:()

我已经研究了好几个小时了,甚至连一个数据库都做不成。我看了很多例子,但都涉及到在程序中制作字典。我需要找出如何将一个已经存在的字典转换成sqlite数据库

我已经尝试了很多,但还没有接近,我不知道我可以去哪里理解这个概念。我已经研究了堆栈溢出,但涉及到这一点的每一个问题都是从零开始制作的字典。我需要一个示例,显示字典只是一个变量

我一个接一个地犯随机错误,运气不好

代码如下:

import os
import subprocess
from tinytag import TinyTag
import sqlite3
import json

tag = ''
extf = ['$RECYCLE.BIN','System Volume Information']
for root, dirs, files in os.walk(r'\\Vgmstation\\e\\', followlinks=True):
    dirs[:] = [d for d in dirs if d not in extf]
    for name in files:
        if name.endswith(".mp4"):
            musiclist=str(os.path.join(root, name))
            tag = TinyTag.get(musiclist)
            tag_dict = tag.as_dict()
            #print(tag_dict)

            conn = sqlite3.connect('musicdatabase.db')
            c = conn.cursor()

            for table in tag_dict.keys():
                c.execute("CREATE TABLE {} ({})".format(table, initial_db))
                for k, v in tag_dict[table].items():
                    c.execute("ALTER TABLE {} \
                                ADD {} {}".format(table, k, v))

            c.close()
            conn.close()

结果如下:

Traceback (most recent call last): File "//VGMSTATION/testing scripts/search and print2.py", line 22, in c.execute("CREATE TABLE {} ({})".format(table, initial_db)) NameError: name 'initial_db' is not defined

我尝试取出初始的_db,因为我只从这里得到了代码:如何从字典创建sqlite3表,但是我得到了以下代码:

import os
import subprocess
from tinytag import TinyTag
import sqlite3
import json

tag = ''
extf = ['$RECYCLE.BIN','System Volume Information']
for root, dirs, files in os.walk(r'\\Vgmstation\\e\\', followlinks=True):
    dirs[:] = [d for d in dirs if d not in extf]
    for name in files:
        if name.endswith(".mp4"):
            musiclist=str(os.path.join(root, name))
            tag = TinyTag.get(musiclist)
            tag_dict = tag.as_dict()
            #print(tag_dict)

            conn = sqlite3.connect('musicdatabase.db')
            c = conn.cursor()

            for table in tag_dict.keys():
                c.execute("CREATE TABLE {} ({})".format(table))
                for k, v in tag_dict[table].items():
                    c.execute("ALTER TABLE {} \
                                ADD {} {}".format(table, k, v))

            c.close()
            conn.close()

结果:

Traceback (most recent call last): File "//VGMSTATION/testing scripts/search and print2.py", line 22, in c.execute("CREATE TABLE {} ({})".format(table)) IndexError: tuple index out of range

以下是tag_dict的外观:

{'comment': u"Shoot 'em up", 'album': u'Fortified Zone', 'audio_offset': None, 'title': u'Main Theme', 'track': None, 'disc_total': None, 'artist': u'Tsukasa Tawada', 'track_total': None, 'channels': 2, 'genre': u'8-Bit', 'albumartist': u'Tsukasa Tawada', 'filesize': 135151220L, 'composer': u'Tsukasa Tawada', 'year': u'1991', 'duration': 96.93016666666666, 'samplerate': 48000, 'bitrate': 294651.393, 'disc': None}
{'comment': u"Shoot 'em up", 'album': u'Fortified Zone', 'audio_offset': None, 'title': u'Stage 2', 'track': None, 'disc_total': None, 'artist': u'Tsukasa Tawada', 'track_total': None, 'channels': 2, 'genre': u'8-Bit', 'albumartist': u'Tsukasa Tawada', 'filesize': 112873545L, 'composer': u'Tsukasa Tawada', 'year': u'1991', 'duration': 83.95053333333334, 'samplerate': 48000, 'bitrate': 294651.393, 'disc': None}
{'comment': u"Shoot 'em up", 'album': u'Fortified Zone', 'audio_offset': None, 'title': u'Track 3', 'track': None, 'disc_total': None, 'artist': u'Tsukasa Tawada', 'track_total': None, 'channels': 2, 'genre': u'8-Bit', 'albumartist': u'Tsukasa Tawada', 'filesize': 134273566L, 'composer': u'Tsukasa Tawada', 'year': u'1991', 'duration': 95.96253333333334, 'samplerate': 48000, 'bitrate': 294651.393, 'disc': None}

我知道有很多这样的问题,但同样,我没有发现任何一个问题将字典作为变量显示在sqlite代码中

此外,我还没有找到使用已创建的字典变量在sqlite中创建表的最基本方法的示例

任何能给我指出正确方向的想法或链接都会很棒!哈哈

谢谢你抽出时间


Tags: nameinimportnonefordb字典os
1条回答
网友
1楼 · 发布于 2024-10-03 09:20:58

这是一个非常简单的例子,说明了如何做到这一点

它只创建一个表-轨道

字段名称/数据类型为硬编码-标题、专辑、评论、流派、艺术家、作曲家、年份,所有文本字段

此外,它仅在当前目录中插入MP3文件的数据

import glob
from tinytag import TinyTag
import sqlite3

def create_table(con, table_name, fields):

  field_info = ','.join([ f'{field} TEXT' for field in fields])
  sql = f'CREATE TABLE IF NOT EXISTS {table_name} ({field_info})'

  cur = con.cursor()

  cur.execute(sql)

  cur.close()

def insert_track(con, table_name, track_data):
  sql = f'INSERT INTO {table_name} VALUES (?,?,?,?,?,?,?)'
  cur = con.cursor()

  cur.execute(sql, track_data)

  conn.commit()

conn = sqlite3.connect('musicdatabase.db')

create_table(conn, 'tracks', ['title', 'album', 'comment', 'genre', 'artist', 'composer', 'year'])

files = glob.glob('*.mp3')

data = [TinyTag.get(file).as_dict() for file in files]

for track in data:
  insert_track(conn, 'tracks', (track['title'], track['album'], track['comment'], track['genre'], track['artist'], track['composer'], track['year']))

conn.close()

相关问题 更多 >