mysql 데이터베이스가 많은 양의 데이터를 저장할 수 있다는 것은 모두가 알고 있지만, mysql에 데이터가 어떻게 저장되는지 알고 계시나요?
일반적으로 MySQL에 데이터를 저장하는 방법에는 동기 모드와 비동기 모드의 두 가지가 있습니다.
동기화 모드
동기화 모드는 SQL 문을 사용하여 데이터베이스에 데이터를 삽입합니다. 그러나 Scrapy의 파싱 속도는 MySQL의 로깅 속도보다 훨씬 빠르며, 파싱량이 많은 경우 MySQL의 로깅이 차단될 수 있습니다.
import MySQLdbclass MysqlPipeline(object): def __init__(self): self.conn = MySQLdb.connect('127.0.0.1','root','root','article_spider',charset="utf8",use_unicode=True) self.cursor = self.conn.cursor() def process_item(self, item, spider): insert_sql = """ insert into jobbole_article(title,create_date,url,url_object_id) VALUES (%s,%s,%s,%s) """ self.cursor.execute(insert_sql,(item["title"],item["create_date"],item["url"],item["url_object_id"])) self.conn.commit()
비동기 모드
동기 모드를 사용하면 차단이 발생할 수 있으므로 Twisted를 사용하여 MySQL을 저장하고 구문 분석할 수 있습니다. 단순한 실행 및 커밋 동기 작업 대신 비동기 작업을 수행합니다.
MySQL 구성과 관련하여 구성 파일에서 직접 데이터베이스를 구성할 수 있습니다.
MYSQL_HOST = "127.0.0.1" MYSQL_DBNAME = "article_spider" MYSQL_USER = "root"MYSQL_PASSWORD = "root"
설정의 구성에서 from_settings를 정의하여 설정 개체를 얻습니다. 설정 구성 파일에서 값을 직접 가져올 수 있는 파이프라인입니다.
Twisted에서 제공하는 비동기 컨테이너를 사용하여 MySQL에 연결합니다.
import MySQLdb import MySQLdb.cursorsfrom twisted.enterprise import adbapi
adbapi를 사용하면 mysqldb 비동기 작업의 일부 작업을 수행할 수 있습니다.
SQL 문에 커서를 사용하여 실행하고 submit
코드 부분 :
class MysqlTwistedPipline(object): def __init__(self,dbpool): self.dbpool = dbpool @classmethod def from_settings(cls,settings): dbparms = dict( host = settings["MYSQL_HOST"], db = settings["MYSQL_DBNAME"], user = settings["MYSQL_USER"], passwd = settings["MYSQL_PASSWORD"], charset = 'utf8', cursorclass = MySQLdb.cursors.DictCursor, use_unicode=True, ) dbpool = adbapi.ConnectionPool("MySQLdb",**dbparms) return cls(dbpool) def process_item(self, item, spider): #使用Twisted将mysql插入变成异步执行 #runInteraction可以将传入的函数变成异步的 query = self.dbpool.runInteraction(self.do_insert,item) #处理异常 query.addErrback(self.handle_error,item,spider) def handle_error(self,failure,item,spider): #处理异步插入的异常 print(failure) def do_insert(self,cursor,item): #会从dbpool取出cursor #执行具体的插入 insert_sql = """ insert into jobbole_article(title,create_date,url,url_object_id) VALUES (%s,%s,%s,%s) """ cursor.execute(insert_sql, (item["title"], item["create_date"], item["url"], item["url_object_id"])) #拿传进的cursor进行执行,并且自动完成commit操作
do_insert를 제외한 위 코드 부분은 재사용이 가능합니다.
위 내용은 mysql에는 데이터가 어떻게 저장되나요?의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!