mysql データベースに大量のデータを保存できることは誰もが知っていますが、mysql にデータがどのように保存されるか知っていますか?
通常、MySQL にデータを保存するには、同期モードと非同期モードの 2 つの方法があります。
#同期モード
同期モードでは、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()
非同期モード
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 adbapiadbapi を使用すると、mysqldb の一部の操作を非同期操作にできます
カーソルを使用して SQL ステートメントを実行および送信します
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 中国語 Web サイトの他の関連記事を参照してください。