2014-03-27 68 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