2014-03-27 69 views
0

使用Scrapy获取一些东西,我想将它存储在数据库中。之前从来没有用MySQL或Python做任何事情,所以寻找一些帮助,为什么这将无法正常工作。Python添加到MySQL数据库

这里是我的代码:

from __future__ import print_function 
from metacritic.items import MetacriticItem 
from mysql.connector import errorcode 
import mysql.connector 
import json 

class MetacriticPipeline(object): 

DB_NAME = 'metacritic' 

TABLES = {} 
TABLES['titles'] = (
    "CREATE TABLE `titles` (" 
    " `name` varchar (14) NOT NULL," 
    " PRIMARY KEY (`emp_no`)" 
    ") ENGINE=InnoDB") 

cnx = mysql.connector.connect(user='root', password = 'andy') 
cursor = cnx.cursor() 

def process_item(self, item, spider): 
    if item['title']: 
     return item 

class JsonWriterPipeline(object): 

def __init__(self): 
    self.file = open('items.jl', 'wb') 

def process_item(self, item, spider): 
    line = json.dumps(dict(item)) + "\n" 
    self.file.write(line) 
    return item 

class WriteToDatabasePipeline(object): 

def create_database(cursor): 
    try: 
     cursor.execute(
      "CREATE DATABASE {} DEFAULT CHARACTER SET 'utf8'".format(DB_NAME)) 
    except mysql.connector.Error as err: 
     print("Failed creating database: {}".format(err)) 
     exit(1) 

try: 
    cnx.database = DB_NAME 
except mysql.connector.Error as err: 
    if err.errno == errorcode.ER_BAD_DB_ERROR: 
     create_database(cursor) 
     cnx.database = DB_NAME 
    else: 
     print(err) 
     exit(1) 

当我尝试运行它,我得到的CMD此错误:

File "metacritic\pipelines.py", line 46, in WriteToDatabasePipeline 
cnx.database = DB_NAME 
NameError: name 'DB_NAME' is not defined 

任何想法,这是为什么?它在我看来像DB_NAME被定义好吗?我只想制作数据库,然后尝试添加表格。 感谢您的帮助

回答

1

您所定义的MetacriticPipeline类中DB_NAME,在脚本的顶部(或更好的移动到scrapy设置),将其移动:

from __future__ import print_function 
from metacritic.items import MetacriticItem 
from mysql.connector import errorcode 
import mysql.connector 
import json 

DB_NAME = 'metacritic' 

class MetacriticPipeline(object): 
    ... 
+0

真棒工作非常感谢:) – AndyOHart

1

DB_NAME在类MetacriticPipeline定义,使它全球或做到这一点:

cnx.database = MetacriticPipeline.DB_NAME 
+0

谢谢你。 alecxe的答案奏效了,所以我将不得不接受他,但是谢谢你的回复,无论如何我都赞成你:) – AndyOHart