用db文件填充MySQL表

0 投票
2 回答
749 浏览
提问于 2025-04-17 10:42

我有一个叫做xx.db的文件,我通过一些键来访问它,并把这些键打印出来以便检查。这个文件里有很多层级的键,这里我只展示最上层的。

    for filename in filenames:
        with contextlib.closing(shelve.open(filename, flag = "w")) as data:     
prdata = data['all'].keys()

print prdata 我在Python中创建了一个这样的表:

tbl= """CREATE TABLE IF NOT EXISTS table2 (
      `class` varchar(30) default NULL,
      `name` varchar(120) default NULL,
       )""" 
cursor.execute(tbl)

我想把从这个.db文件中获取的第一组数据加载到我创建的MySQLdb表里。我该怎么做呢?我需要先从这个db文件创建一个文本文件吗?我听说使用LOAD DATA INFILE可以快速地从文本文件加载数据到数据库。因为db里有很多数据,如果能跳过先制作文本文件的步骤,那会更快。

编辑: 我试过这样做,但出现了语法错误:“你的SQL语法有错误;请检查与你的MySQL服务器版本相对应的手册,以获取正确的语法,错误发生在'prdata INTO TABLE table2 \n\t FIELDS TERMINATED BY ' '附近。”我对语法文档理解得不太正确,也不知道怎么在Python中把它包裹起来。

LOAD DATA [LOW_PRIORITY | CONCURRENT] [LOCAL] INFILE 'file_name'
    [REPLACE | IGNORE]
    INTO TABLE tbl_name
    [CHARACTER SET charset_name]
    [{FIELDS | COLUMNS}
        [TERMINATED BY 'string']
        [[OPTIONALLY] ENCLOSED BY 'char']
        [ESCAPED BY 'char']
    ]

for filename in filenames: with contextlib.closing(shelve.open(filename, flag = "w")) as data:
prdata = data['all'].keys()

cursor.execute("""LOAD DATA INFILE prdata INTO TABLE table2 FIELDS TERMINATED BY ' ' """)

更新:决定使用INSERT INTO table2 (class,name) VALUE (%s,%s),这样可以正常工作。

2 个回答

0

你也可以通过Python来加载数据:

cursor.executemany(
      """INSERT INTO table2 (class, name)
      VALUES (%s, %s)""",
      [
      ("class1", "name1" ),
      ("class2", "name2" ),
      ("class3", "name3" )
      ] )

文档可以在这里找到:http://mysql-python.sourceforge.net/MySQLdb.html

1

当你建立连接的时候,别忘了加上 local_infile 这个参数。

connection = MySQLdb.connect(host="localhost", user="appuser", passwd="",
db="test", local_infile = 1)

否则你会看到这个错误:

ERROR 1148 (42000): The used command is not allowed with this MySQL version

撰写回答