Pandas: рдЙрдЪреНрдЪ рд╡рд┐рд▓рдВрдмрддрд╛ рдХрдиреЗрдХреНрд╢рди рдкрд░ to_sql рдкрд░ рдмрдбрд╝реЗ рдкреИрдорд╛рдиреЗ рдкрд░ рдЧрддрд┐ рдХреЗ рд▓рд┐рдП рдмрд╣реБ-рдкрдВрдХреНрддрд┐ рд╕рдореНрдорд┐рд▓рди рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░реЗрдВ

рдХреЛ рдирд┐рд░реНрдорд┐рдд 1 рджрд┐рд╕ре░ 2014  ┬╖  48рдЯрд┐рдкреНрдкрдгрд┐рдпрд╛рдБ  ┬╖  рд╕реНрд░реЛрдд: pandas-dev/pandas

рдореИрдВ рдкрд╛рдВрдбрд╛-0.15.1, Oursql-0.9.3.1 рдФрд░ sqlalchemy-0.9.4 рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдХреЗ рдПрдХ MySQL рдбреЗрдЯрд╛рдмреЗрд╕ рдореЗрдВ ~ 30k рдкрдВрдХреНрддрд┐рдпреЛрдВ рдХреЛ рд╕рдореНрдорд┐рд▓рд┐рдд рдХрд░рдиреЗ рдХрд╛ рдкреНрд░рдпрд╛рд╕ рдХрд░ рд░рд╣рд╛ рд╣реВрдВред рдХреНрдпреЛрдВрдХрд┐ рдорд╢реАрди рдореЗрд░реЗ рдкрд╛рд╕ рд╕реЗ рдЕрдЯрд▓рд╛рдВрдЯрд┐рдХ рдХреЗ рдкрд╛рд░ рд╣реИ, data.to_sql рдХреЛ рдХреЙрд▓ рдХрд░рдиреЗ рдореЗрдВ рдбреЗрдЯрд╛ рдбрд╛рд▓рдиреЗ рдореЗрдВ> 1 рдШрдВрдЯрд╛ рд▓рдЧ рд░рд╣рд╛ рдерд╛ред рд╡рд╛рдпрд░рд╢рд░реНрдХ рдХреЗ рд╕рд╛рде рдирд┐рд░реАрдХреНрд╖рдг рдХрд░рдиреЗ рдкрд░, рдореБрджреНрджрд╛ рдпрд╣ рд╣реИ рдХрд┐ рдпрд╣ рдкреНрд░рддреНрдпреЗрдХ рдкрдВрдХреНрддрд┐ рдХреЗ рд▓рд┐рдП рдПрдХ рдЗрдВрд╕рд░реНрдЯ рднреЗрдЬ рд░рд╣рд╛ рд╣реИ, рдлрд┐рд░ рдЕрдЧрд▓реА рднреЗрдЬрдиреЗ рд╕реЗ рдкрд╣рд▓реЗ рдПрд╕реАрдХреЗ рдХреА рдкреНрд░рддреАрдХреНрд╖рд╛ рдХрд░ рд░рд╣рд╛ рд╣реИ, рдФрд░, рд▓рдВрдмреА рдХрд╣рд╛рдиреА рдЫреЛрдЯреА, рдкрд┐рдВрдЧ рдЯрд╛рдЗрдореНрд╕ рдореБрдЭреЗ рдорд╛рд░ рд░рд╣реЗ рд╣реИрдВред

рд╣рд╛рд▓рд╛рдБрдХрд┐, SQLAlchemy рдХреЗ рдирд┐рд░реНрджреЗрд╢реЛрдВ рдХрд╛ рдкрд╛рд▓рди рдХрд░рддреЗ рд╣реБрдП, рдореИрдВ рдмрджрд▓ рдЧрдпрд╛

def _execute_insert(self, conn, keys, data_iter):
    data = [dict((k, v) for k, v in zip(keys, row)) for row in data_iter]
    conn.execute(self.insert_statement(), data)

рдкреНрд░рддрд┐

def _execute_insert(self, conn, keys, data_iter):
    data = [dict((k, v) for k, v in zip(keys, row)) for row in data_iter]
    conn.execute(self.insert_statement().values(data))

рдФрд░ рдкреВрд░рд╛ рдСрдкрд░реЗрд╢рди рдПрдХ рдорд┐рдирдЯ рд╕реЗ рднреА рдХрдо рд╕рдордп рдореЗрдВ рдкреВрд░рд╛ рд╣реЛ рдЬрд╛рддрд╛ рд╣реИред (рдЖрдкрдХреЛ рдПрдХ рдХреНрд▓рд┐рдХ рдмрдЪрд╛рдиреЗ рдХреЗ рд▓рд┐рдП, insert into foo (columns) values (rowX) рдХреЗ рд▓рд┐рдП рдХрдИ рдХреЙрд▓ рдФрд░ рдПрдХ рдмрдбрд╝реЗ рдкреИрдорд╛рдиреЗ рдкрд░ insert into foo (columns) VALUES (row1), (row2), row3) рдХреЗ рдмреАрдЪ рдХрд╛ рдЕрдВрддрд░ рд╣реИ)ред рдпрд╣ рджреЗрдЦрддреЗ рд╣реБрдП рдХрд┐ рдмрдбрд╝реА рдорд╛рддреНрд░рд╛ рдореЗрдВ рдбреЗрдЯрд╛ рдбрд╛рд▓рдиреЗ рдХреЗ рд▓рд┐рдП рд▓реЛрдЧ рдХрд┐рддрдиреА рдмрд╛рд░ рдкрд╛рдВрдбрд╛ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рддреЗ рд╣реИрдВ, рдпрд╣ рдПрдХ рдмрдбрд╝реА рдЬреАрдд рдХреА рддрд░рд╣ рд▓рдЧрддрд╛ рд╣реИ рдЬрд┐рд╕реЗ рдЕрдзрд┐рдХ рд╡реНрдпрд╛рдкрдХ рд░реВрдк рд╕реЗ рд╢рд╛рдорд┐рд▓ рдХрд┐рдпрд╛ рдЬрд╛рдирд╛ рдмрд╣реБрдд рдЕрдЪреНрдЫрд╛ рд╣реЛрдЧрд╛ред

рдХреБрдЫ рдЪреБрдиреМрддрд┐рдпрд╛рдБ:

  • рдкреНрд░рддреНрдпреЗрдХ рдбреЗрдЯрд╛рдмреЗрд╕ рдорд▓реНрдЯреАрд░реЛ рдЗрдиреНрд╕рд░реНрдЯ рдХрд╛ рд╕рдорд░реНрдерди рдирд╣реАрдВ рдХрд░рддрд╛ рд╣реИ (SQLite рдФрд░ SQLServer рдЕрддреАрдд рдореЗрдВ рдирд╣реАрдВ рдереЗ, рд╣рд╛рд▓рд╛рдВрдХрд┐ рд╡реЗ рдЕрдм рдХрд░рддреЗ рд╣реИрдВ)ред рдореБрдЭреЗ рдирд╣реАрдВ рдкрддрд╛ рдХрд┐ SQLAlchemy рдХреЗ рдорд╛рдзреНрдпрдо рд╕реЗ рдЗрд╕рдХреА рдЬрд╛рдВрдЪ рдХреИрд╕реЗ рдХрд░реЗрдВ
  • рдореИрдВ рдЬрд┐рд╕ MySQL рд╕рд░реНрд╡рд░ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░ рд░рд╣рд╛ рдерд╛, рдЙрд╕рдиреЗ рдореБрдЭреЗ рдПрдХ рд╣реА рдмрд╛рд░ рдореЗрдВ рдбреЗрдЯрд╛ рд╕рдореНрдорд┐рд▓рд┐рдд рдХрд░рдиреЗ рдХреА рдЕрдиреБрдорддрд┐ рдирд╣реАрдВ рджреА, рдореБрдЭреЗ рдЪрдВрдХреНрд╕рд╛рдЗрдЬрд╝ рд╕реЗрдЯ рдХрд░рдирд╛ рдкрдбрд╝рд╛ (5k рдиреЗ рдареАрдХ рдХрд╛рдо рдХрд┐рдпрд╛, рд▓реЗрдХрд┐рди рдореБрдЭреЗ рд▓рдЧрддрд╛ рд╣реИ рдХрд┐ рдкреВрд░реНрдг 30k рдмрд╣реБрдд рдЕрдзрд┐рдХ рдерд╛)ред рдпрджрд┐ рд╣рдордиреЗ рдЗрд╕реЗ рдбрд┐рдлрд╝реЙрд▓реНрдЯ рдЗрдВрд╕рд░реНрдЯ рдмрдирд╛рдпрд╛ рд╣реИ, рддреЛ рдЕрдзрд┐рдХрд╛рдВрд╢ рд▓реЛрдЧреЛрдВ рдХреЛ рдПрдХ рдЪрдВрдХ рдЖрдХрд╛рд░ рдЬреЛрдбрд╝рдирд╛ рд╣реЛрдЧрд╛ (рдЬрд┐рд╕рдХреА рдЧрдгрдирд╛ рдХрд░рдирд╛ рдХрдард┐рди рд╣реЛ рд╕рдХрддрд╛ рд╣реИ, рдХреНрдпреЛрдВрдХрд┐ рдпрд╣ рд╕рд░реНрд╡рд░ рдХреЗ рдЕрдзрд┐рдХрддрдо рдкреИрдХреЗрдЯ рдЖрдХрд╛рд░ рджреНрд╡рд╛рд░рд╛ рдирд┐рд░реНрдзрд╛рд░рд┐рдд рдХрд┐рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИ)ред

рдРрд╕рд╛ рдХрд░рдиреЗ рдХрд╛ рд╕рдмрд╕реЗ рдЖрд╕рд╛рди рддрд░реАрдХрд╛, multirow= рдмреВрд▓рд┐рдпрди рдкреИрд░рд╛рдореАрдЯрд░ (рдбрд┐рдлрд╝реЙрд▓реНрдЯ False ) рдХреЛ to_sql рдлрд╝рдВрдХреНрд╢рди рдореЗрдВ рдЬреЛрдбрд╝рдирд╛ рд╣реЛрдЧрд╛, рдФрд░ рдлрд┐рд░ рдЙрдкрдпреЛрдЧрдХрд░реНрддрд╛ рдХреЛ рдЪрдВрдХреНрд╕рд╛рдЗрдЬрд╝ рд╕реЗрдЯ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдЬрд╝рд┐рдореНрдореЗрджрд╛рд░ рдЫреЛрдбрд╝ рджреЗрдВ, рд▓реЗрдХрд┐рди рд╢рд╛рдпрдж рдПрдХ рдмреЗрд╣рддрд░ рддрд░реАрдХрд╛ рд╣реИ?

рд╡рд┐рдЪрд╛рд░?

рд╕рдмрд╕реЗ рдЙрдкрдпреЛрдЧреА рдЯрд┐рдкреНрдкрдгреА

рд╣рдордиреЗ рдпрд╣ рдкрддрд╛ рд▓рдЧрд╛ рд▓рд┐рдпрд╛ рд╣реИ рдХрд┐ рдордВрдХреА рдкреИрдЪ рдХреИрд╕реЗ рд▓рдЧрд╛рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ - рдпрд╣ рдХрд┐рд╕реА рдФрд░ рдХреЗ рд▓рд┐рдП рдЙрдкрдпреЛрдЧреА рд╣реЛ рд╕рдХрддрд╛ рд╣реИред рдкрд╛рдВрдбрд╛ рдЖрдпрд╛рдд рдХрд░рдиреЗ рд╕реЗ рдкрд╣рд▓реЗ рдпрд╣ рдХреЛрдб рд░рдЦреЗрдВред

from pandas.io.sql import SQLTable

def _execute_insert(self, conn, keys, data_iter):
    print "Using monkey-patched _execute_insert"
    data = [dict((k, v) for k, v in zip(keys, row)) for row in data_iter]
    conn.execute(self.insert_statement().values(data))

SQLTable._execute_insert = _execute_insert

рд╕рднреА 48 рдЯрд┐рдкреНрдкрдгрд┐рдпрд╛рдБ

рдпрд╣ рд╡рд╛рдЬрд┐рдм рд▓рдЧрддрд╛ рд╣реИред рдЗрд╕рдХреА рдЬрд╛рдВрдЪ рдХреЗ рд▓рд┐рдП рдзрдиреНрдпрд╡рд╛рдж!

рдХрд╛рд░реНрдпрд╛рдиреНрд╡рдпрди рдХреЗ рд▓рд┐рдП, рдпрд╣ рдЗрд╕ рдмрд╛рдд рдкрд░ рдирд┐рд░реНрднрд░ рдХрд░реЗрдЧрд╛ рдХрд┐ рдХреИрд╕реЗ sqlalchemy рдбреЗрдЯрд╛рдмреЗрд╕ рд╕реНрд╡рд╛рджреЛрдВ рд╕реЗ рд╕рдВрдмрдВрдзрд┐рдд рд╣реИ рдЬреЛ рдЗрд╕рдХрд╛ рд╕рдорд░реНрдерди рдирд╣реАрдВ рдХрд░рддрд╛ рд╣реИ (рдореИрдВ рдЗрд╕ рд╕рдордп рдЗрд╕рдХрд╛ рдкрд░реАрдХреНрд╖рдг рдирд╣реАрдВ рдХрд░ рд╕рдХрддрд╛, рд▓реЗрдХрд┐рди рдРрд╕рд╛ рд▓рдЧрддрд╛ рд╣реИ рдХрд┐ sqlalchemy рдПрдХ рддреНрд░реБрдЯрд┐ рдЙрдард╛рддрд╛ рд╣реИ (рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП http://stackoverflow.com/questions/ 23886764/рдПрдХрд╛рдзрд┐рдХ-рд╕рдореНрдорд┐рд▓рд┐рдд-рдХрдерди-рдореЗрдВ-mssql-рд╕рд╛рде-sqlalchemy)ред рдЗрд╕рдХреЗ рдЕрд▓рд╛рд╡рд╛, рдЕрдЧрд░ рдЗрд╕рдХрд╛ рдкрд░рд┐рдгрд╛рдо рдпрд╣ рд╣реИ рдХрд┐ рдмрд╣реБрдд рд╕реЗ рд▓реЛрдЧреЛрдВ рдХреЛ рдЪрдВрдХреНрд╕реЗрд╕ рд╕реЗрдЯ рдХрд░рдирд╛ рд╣реЛрдЧрд╛, рддреЛ рдпрд╣ рд╡рд╛рд╕реНрддрд╡ рдореЗрдВ рдбрд┐рдлрд╝реЙрд▓реНрдЯ рдХреЗ рд░реВрдк рдореЗрдВ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдПрдХ рдЕрдЪреНрдЫрд╛ рд╡рд┐рдЪрд╛рд░ рдирд╣реАрдВ рд╣реИ (рдЬрдм рддрдХ рдХрд┐ рд╣рдо рд╕реЗрдЯ рдирд╣реАрдВ рдХрд░рддреЗ рд╣реИрдВ рдбрд┐рдлрд╝реЙрд▓реНрдЯ рд░реВрдк рд╕реЗ рдПрдХ рдорд╛рди рдХреЗ рд▓рд┐рдП рдЦрдВрдбрд┐рдд рдХрд░реЗрдВ)ред
рддреЛ рдПрдХ рдХреАрд╡рд░реНрдб рдЬреЛрдбрд╝рдирд╛ рд╢рд╛рдпрдж рдмреЗрд╣рддрд░ рд▓рдЧрддрд╛ рд╣реИред

@artemyk @mangecoeur @hayd @danielballan

рд╕реНрдкрд╖реНрдЯ рд░реВрдк рд╕реЗ SQLAlchemy рдХрд╛ рдзреНрд╡рдЬ dialect.supports_multivalues_insert рд╣реИ (рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП http://pydoc.net/Python/SQLAlchemy/0.8.3/sqlalchemy.sql.compiler/ рджреЗрдЦреЗрдВ, рдЬрд┐рд╕реЗ рд╕рдВрднрд╡рддрдГ supports_multirow_insert рдЕрдиреНрдп рд╕рдВрд╕реНрдХрд░рдгреЛрдВ рдореЗрдВ рдХрд╣рд╛ рдЬрд╛рддрд╛ рд╣реИ, https ://www.mail-archive.com/[email protected]/msg202880.html)ред

рдЪреВрдВрдХрд┐ рдЗрд╕рдореЗрдВ рдмрд╣реБрдд рддреЗрдЬреА рд╕реЗ рдбрд╛рд▓рдиреЗ рдХреА рдХреНрд╖рдорддрд╛ рд╣реИ, рдФрд░ рд╣рдо рдЖрд╕рд╛рдиреА рд╕реЗ рд╕рдорд░реНрдерди рдХреА рдЬрд╛рдВрдЪ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ, рдореИрдВ рд╕реЛрдЪ рд░рд╣рд╛ рд╣реВрдВ рдХрд┐ рд╣рдо рдЗрд╕реЗ рдбрд┐рдлрд╝реЙрд▓реНрдЯ рд░реВрдк рд╕реЗ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ, рдФрд░ рдбрд┐рдлрд╝реЙрд▓реНрдЯ рдорд╛рди рдкрд░ рдЪрдВрдХреНрд╕рд╛рдЗрдЬ рднреА рд╕реЗрдЯ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ (рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП 16kb рднрд╛рдЧ ... рд╕реБрдирд┐рд╢реНрдЪрд┐рдд рдирд╣реАрдВ рд╣реИ рдХрд┐ рдХреНрдпрд╛ рд╣реИ рдЬреНрдпрд╛рджрд╛рддрд░ рд╕реНрдерд┐рддрд┐рдпреЛрдВ рдореЗрдВ рдмрд╣реБрдд рдмрдбрд╝рд╛)ред рдпрджрд┐ рдорд▓реНрдЯреАрд░реЛ рдЗрдВрд╕рд░реНрдЯ рд╡рд┐рдлрд▓ рд╣реЛ рдЬрд╛рддрд╛ рд╣реИ, рддреЛ рд╣рдо рдЪрдВрдХреНрд╕рд╕рд╛рдЗрдЬрд╝ рдХреЛ рдХрдо рдХрд░рдиреЗ рдХрд╛ рд╕реБрдЭрд╛рд╡ рджреЗрддреЗ рд╣реБрдП рдПрдХ рдЕрдкрд╡рд╛рдж рдлреЗрдВрдХ рд╕рдХрддреЗ рд╣реИрдВ?

рдЕрдм рдореБрдЭреЗ SQLAlchemy рд▓реЛрдЧреЛрдВ рдХреЛ SQL рд╕рд░реНрд╡рд░>2005 рдкрд░ supports_multivalues_insert рдХреЛ рд╕рд╣реА рдкрд░ рд╕реЗрдЯ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдордирд╛рдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИ (рдореИрдВрдиреЗ рдЗрд╕реЗ рдХреЛрдб рдореЗрдВ рд╣реИрдХ рдХрд┐рдпрд╛ рд╣реИ рдФрд░ рдпрд╣ рдареАрдХ рдХрд╛рдо рдХрд░рддрд╛ рд╣реИ, рд▓реЗрдХрд┐рди рдпрд╣ рдбрд┐рдлрд╝реЙрд▓реНрдЯ рд░реВрдк рд╕реЗ рдЪрд╛рд▓реВ рдирд╣реАрдВ рд╣реИ)ред

рдПрдХ рдФрд░ рд╡рд┐рд╖рдп рдкрд░ рдиреЛрдЯ рдкрд░, рдореБрдЭреЗ рд▓рдЧрддрд╛ рд╣реИ рдХрд┐ рдЦрдВрдб рдЖрдХрд╛рд░ рдореБрд╢реНрдХрд┐рд▓ рд╣реЛ рд╕рдХрддрд╛ рд╣реИред рдореЗрд░реЗ MySQL рд╕реЗрдЯрдЕрдк рдкрд░ (рдЬрд┐рд╕реЗ рдореИрдВрдиреЗ рд╢рд╛рдпрдж рдмрдбрд╝реЗ рдкреИрдХреЗрдЯ рдХреЛ рдЕрдиреБрдорддрд┐ рджреЗрдиреЗ рдХреЗ рд▓рд┐рдП рдХреЙрдиреНрдлрд╝рд┐рдЧрд░ рдХрд┐рдпрд╛ рд╣реИ), рдореИрдВ рдЕрдкрдиреЗ SQLServer рд╕реЗрдЯрдЕрдк рдкрд░ рдЪрдВрдХреНрд╕рд╕рд╛рдЗрдЬ = 5000 рд╕реЗрдЯ рдХрд░ рд╕рдХрддрд╛ рд╣реВрдВ, 500 рдмрд╣реБрдд рдмрдбрд╝рд╛ рдерд╛, рд▓реЗрдХрд┐рди 100 рдиреЗ рдареАрдХ рдХрд╛рдо рдХрд┐рдпрд╛ред рд╣рд╛рд▓рд╛рдВрдХрд┐, рдпрд╣ рд╢рд╛рдпрдж рд╕рдЪ рд╣реИ рдХрд┐ рдЗрд╕ рддрдХрдиреАрдХ рд╕реЗ рдЕрдзрд┐рдХрд╛рдВрд╢ рд▓рд╛рдн 100 рд╕реЗ 1000 рдХреЗ рдмрдЬрд╛рдп рдПрдХ рдмрд╛рд░ рдореЗрдВ 1 рдкрдВрдХреНрддрд┐ рдбрд╛рд▓рдиреЗ рд╕реЗ рдЖрддреЗ рд╣реИрдВред

рдХреНрдпрд╛ рд╣реЛрдЧрд╛ рдпрджрд┐ chunksize=None рдХрд╛ рдЕрд░реНрде "рдЕрдиреБрдХреВрд▓ рд░реВрдк рд╕реЗ рдПрдХ рдЦрдВрдб рдЪреБрдиреЗрдВ"? 5000, 500, 50, 1 рдЬреИрд╕рд╛ рдХреБрдЫ рдХрд░рдиреЗ рдХрд╛ рдкреНрд░рдпрд╛рд╕ рдХрд░реЗрдВред рдЙрдкрдпреЛрдЧрдХрд░реНрддрд╛ рдПрдХ рдЦрдВрдб рдирд┐рд░реНрджрд┐рд╖реНрдЯ рдХрд░рдХреЗ рдЗрд╕реЗ рдмрдВрдж рдХрд░ рд╕рдХрддреЗ рд╣реИрдВред рдпрджрд┐ рдЗрди рдкреНрд░рдпрд╛рд╕реЛрдВ рдХрд╛ рдУрд╡рд░рд╣реЗрдб рдмрд╣реБрдд рдмрдбрд╝рд╛ рд╣реИ, рддреЛ рдореБрдЭреЗ @maxgrenderjones рд╕реБрдЭрд╛рд╡ рдкрд╕рдВрдж рд╣реИ: chunksize=10 chunksize=1 рд╕реЗ рдмреЗрд╣рддрд░ рдбрд┐рдлрд╝реЙрд▓реНрдЯ рд╣реИред

рдЙрд╕ рдЖрдЦрд┐рд░реА рдЯрд┐рдкреНрдкрдгреА рдкрд░ " chunksize=10 chunksize=1 " рд╕реЗ рдмреЗрд╣рддрд░ рдбрд┐рдлрд╝реЙрд▓реНрдЯ рд╣реИ -> рдпрд╣ рдкреВрд░реА рддрд░рд╣ рд╕реЗ рд╕рдЪ рдирд╣реАрдВ рд╣реИ рдЬреЛ рдореБрдЭреЗ рд▓рдЧрддрд╛ рд╣реИред рд╡рд░реНрддрдорд╛рди рд╕реНрдерд┐рддрд┐ _one_ рдПрдХреНрдЬрд╝реАрдХреНрдпреВрдЯ рд╕реНрдЯреЗрдЯрдореЗрдВрдЯ рдХрд░рдирд╛ рд╣реИ рдЬрд┐рд╕рдореЗрдВ рдорд▓реНрдЯреАрд▓рд╛рдЗрди рд╕рд┐рдВрдЧрд▓-рд░реЛ рдЗрдВрд╕рд░реНрдЯ рд╕реНрдЯреЗрдЯрдореЗрдВрдЯ (рдЬреЛ рдХрд┐ 1 рдХрд╛ рдПрдХ рд╣рд┐рд╕реНрд╕рд╛ рдирд╣реАрдВ рд╣реИ) рд╢рд╛рдорд┐рд▓ рд╣реИрдВ, рдЬрдмрдХрд┐ chunksize=10 рдХрд╛ рдорддрд▓рдм рд╣рд░ рдмрд╛рд░ рдПрдХ рдорд▓реНрдЯреА-рд░реЛ рдХреЗ рд╕рд╛рде рдмрд╣реБрдд рд╕рд╛рд░реЗ рдПрдХреНрдЬрд╝рд┐рдХреНрдпреВрдЯ рд╕реНрдЯреЗрдЯрдореЗрдВрдЯ рдХрд░рдирд╛ рд╣реЛрдЧрд╛ред рдбрд╛рд▓реЗрдВред
рдФрд░ рдореИрдВ рдирд╣реАрдВ рдЬрд╛рдирддрд╛ рдХрд┐ рдХреНрдпрд╛ рдпрд╣ рдЖрд╡рд╢реНрдпрдХ рд░реВрдк рд╕реЗ рддреЗрдЬрд╝ рд╣реИ, рд▓реЗрдХрд┐рди рдмрд╣реБрдд рдХреБрдЫ рд╕реНрдерд┐рддрд┐ рдкрд░ рдирд┐рд░реНрднрд░ рдХрд░рддрд╛ рд╣реИред рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП рд╡рд░реНрддрдорд╛рди рдХреЛрдб рдФрд░ рд╕реНрдерд╛рдиреАрдп рдПрд╕рдХреНрд▓рд╛рдЗрдЯ рдбреЗрдЯрд╛рдмреЗрд╕ рдХреЗ рд╕рд╛рде:

In [4]: engine = create_engine('sqlite:///:memory:') #, echo='debug')

In [5]: df = pd.DataFrame(np.random.randn(50000, 10))

In [6]: %timeit df.to_sql('test_default', engine, if_exists='replace')
1 loops, best of 3: 956 ms per loop

In [7]: %timeit df.to_sql('test_default', engine, if_exists='replace', chunksize=10)
1 loops, best of 3: 2.23 s per loop

рд▓реЗрдХрд┐рди рдирд┐рд╢реНрдЪрд┐рдд рд░реВрдк рд╕реЗ рдпрд╣ рдмрд╣реБ-рдкрдВрдХреНрддрд┐ рд╕реБрд╡рд┐рдзрд╛ рдХрд╛ рдЙрдкрдпреЛрдЧ рдирд╣реАрдВ рдХрд░рддрд╛ рд╣реИ

рд╣рдордиреЗ рдпрд╣ рдкрддрд╛ рд▓рдЧрд╛ рд▓рд┐рдпрд╛ рд╣реИ рдХрд┐ рдордВрдХреА рдкреИрдЪ рдХреИрд╕реЗ рд▓рдЧрд╛рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ - рдпрд╣ рдХрд┐рд╕реА рдФрд░ рдХреЗ рд▓рд┐рдП рдЙрдкрдпреЛрдЧреА рд╣реЛ рд╕рдХрддрд╛ рд╣реИред рдкрд╛рдВрдбрд╛ рдЖрдпрд╛рдд рдХрд░рдиреЗ рд╕реЗ рдкрд╣рд▓реЗ рдпрд╣ рдХреЛрдб рд░рдЦреЗрдВред

from pandas.io.sql import SQLTable

def _execute_insert(self, conn, keys, data_iter):
    print "Using monkey-patched _execute_insert"
    data = [dict((k, v) for k, v in zip(keys, row)) for row in data_iter]
    conn.execute(self.insert_statement().values(data))

SQLTable._execute_insert = _execute_insert

рд╣реЛ рд╕рдХрддрд╛ рд╣реИ рдХрд┐ рд╣рдо рдЗрд╕ рд╕реБрд╡рд┐рдзрд╛ рдХреЛ рдПрдХ рдирдП multirow=True рдХреАрд╡рд░реНрдб (рдЕрднреА рдХреЗ рд▓рд┐рдП рдЧрд▓рдд рдХреЗ рдбрд┐рдлрд╝реЙрд▓реНрдЯ рдХреЗ рд╕рд╛рде) рдХреЗ рдорд╛рдзреНрдпрдо рд╕реЗ рдЬреЛрдбрд╝рдиреЗ рдХреЗ рд╕рд╛рде рд╢реБрд░реВ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ, рдФрд░ рдлрд┐рд░ рд╣рдо рдмрд╛рдж рдореЗрдВ рд╣рдореЗрд╢рд╛ рджреЗрдЦ рд╕рдХрддреЗ рд╣реИрдВ рдХрд┐ рдХреНрдпрд╛ рд╣рдо рдЗрд╕реЗ рдбрд┐рдлрд╝реЙрд▓реНрдЯ рд░реВрдк рд╕реЗ рд╕рдХреНрд╖рдо рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ?

@maxgrenderjones @nhockham рдЗрд╕реЗ рдЬреЛрдбрд╝рдиреЗ рдХреЗ рд▓рд┐рдП рдкреАрдЖрд░ рдХрд░рдиреЗ рдХреЗ рдЗрдЪреНрдЫреБрдХ рд╣реИрдВ?

@jorisvandenbossche рдореБрдЭреЗ рд▓рдЧрддрд╛ рд╣реИ рдХрд┐ рд╡рд┐рд╢рд┐рд╖реНрдЯ рдкреНрд░рджрд░реНрд╢рди рдкреНрд░реЛрдлрд╛рдЗрд▓ рдХреЛ рд╕рдВрдмреЛрдзрд┐рдд рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдХреАрд╡рд░реНрдб рддрд░реНрдХ рдЬреЛрдбрд╝рдирд╛ рд╢реБрд░реВ рдХрд░рдирд╛ рдЬреЛрдЦрд┐рдо рднрд░рд╛ рд╣реИред рдпрджрд┐ рдЖрдк рдЧрд╛рд░рдВрдЯреА рджреЗ рд╕рдХрддреЗ рд╣реИрдВ рдХрд┐ рдпрд╣ рд╕рднреА рдорд╛рдорд▓реЛрдВ рдореЗрдВ рддреЗрдЬрд╝ рд╣реИ (рдпрджрд┐ рдЖрд╡рд╢реНрдпрдХ рд╣реЛ рддреЛ рдЗрд╕реЗ рдЗрдирдкреБрдЯ рдХреЗ рдЖрдзрд╛рд░ рдкрд░ рд╕рд░реНрд╡реЛрддреНрддрдо рд╡рд┐рдзрд┐ рдирд┐рд░реНрдзрд╛рд░рд┐рдд рдХрд░рдХреЗ) рддреЛ рдЖрдкрдХреЛ рдзреНрд╡рдЬ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рдирд╣реАрдВ рд╣реИред

рдЕрд▓рдЧ-рдЕрд▓рдЧ рдбреАрдмреА-рд╕реЗрдЯрдЕрдк рдореЗрдВ рдЕрд▓рдЧ-рдЕрд▓рдЧ рдкреНрд░рджрд░реНрд╢рди рдЕрдиреБрдХреВрд▓рди рд╣реЛ рд╕рдХрддреЗ рд╣реИрдВ (рдЕрд▓рдЧ-рдЕрд▓рдЧ рдбреАрдмреА рдкрд░рдл рдкреНрд░реЛрдлрд╛рдЗрд▓, рд╕реНрдерд╛рдиреАрдп рдмрдирд╛рдо рдиреЗрдЯрд╡рд░реНрдХ, рдмрдбрд╝реА рдореЗрдореЛрд░реА рдмрдирд╛рдо рддреЗрдЬ рдПрд╕рдПрд╕рдбреА, рдЖрджрд┐, рдЖрджрд┐), рдпрджрд┐ рдЖрдк рдкреНрд░рддреНрдпреЗрдХ рдХреЗ рд▓рд┐рдП рдХреАрд╡рд░реНрдб рдЭрдВрдбреЗ рдЬреЛрдбрд╝рдирд╛ рд╢реБрд░реВ рдХрд░рддреЗ рд╣реИрдВ рддреЛ рдпрд╣ рдПрдХ рдЧрдбрд╝рдмрдбрд╝ рд╣реЛ рдЬрд╛рддрд╛ рд╣реИред

рдореИрдВ рдкреНрд░рджрд░реНрд╢рди рд╡рд┐рд╢рд┐рд╖реНрдЯ рдХрд╛рд░реНрдпрд╛рдиреНрд╡рдпрди рдХреЛ рд╕рдВрдмреЛрдзрд┐рдд рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП SQLDatabase рдФрд░ SQLTable рдХреЗ рдЙрдк-рд╡рд░реНрдЧ рдмрдирд╛рдиреЗ рдХрд╛ рд╕реБрдЭрд╛рд╡ рджреВрдВрдЧрд╛, рдЙрдирдХрд╛ рдЙрдкрдпреЛрдЧ рдСрдмреНрдЬреЗрдХреНрдЯ-рдУрд░рд┐рдПрдВрдЯреЗрдб рдПрдкреАрдЖрдИ рдХреЗ рдорд╛рдзреНрдпрдо рд╕реЗ рдХрд┐рдпрд╛ рдЬрд╛рдПрдЧрд╛ред рд╢рд╛рдпрдж рдПрдХ "рдмреИрдХрдПрдВрдб рд╕реНрд╡рд┐рдЪрд┐рдВрдЧ" рд╡рд┐рдзрд┐ рдХреЛ рдЬреЛрдбрд╝рд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИ рд▓реЗрдХрд┐рди рд╕реНрдкрд╖реНрдЯ рд░реВрдк рд╕реЗ рдУрдУ рдПрдкреАрдЖрдИ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдирд╛ рдмрд╣реБрдд рдЖрд╕рд╛рди рд╣реИ, рдЗрд╕рд▓рд┐рдП рдпрд╣ рд╢рд╛рдпрдж рдкрд╣рд▓реЗ рд╕реЗ рд╣реА рдПрдХ рд╡рд┐рд╢реЗрд╖ рдЙрдкрдпреЛрдЧ-рдорд╛рдорд▓реЗ рдХреЗ рд▓рд┐рдП рдЕрдзрд┐рдХ рд╣реИред

рдореИрдВрдиреЗ рдкреЛрд╕реНрдЯрдЧреНрд░реЗрдЬ рдореЗрдВ рдмрдбрд╝реЗ рдбреЗрдЯрд╛рд╕реЗрдЯ рд▓реЛрдб рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдРрд╕рд╛ рдЙрдк-рд╡рд░реНрдЧ рдмрдирд╛рдпрд╛ рд╣реИ (рдпрд╣ рд╡рд╛рд╕реНрддрд╡ рдореЗрдВ рд╕реАрдПрд╕рд╡реА рдореЗрдВ рдбреЗрдЯрд╛ рдХреЛ рд╕рд╣реЗрдЬрдиреЗ рдХреЗ рд▓рд┐рдП рдмрд╣реБрдд рддреЗрдЬрд╝ рд╣реИ, рдлрд┐рд░ рдЕрдВрддрд░реНрдирд┐рд╣рд┐рдд рдЧреИрд░-рдорд╛рдирдХ рдХреЙрдкреА рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░реЗрдВ, рдЬреЛ рдХрд┐ рдЗрдиреНрд╕рд░реНрдЯ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдиреЗ рдХреА рддреБрд▓рдирд╛ рдореЗрдВ рдПрд╕рдХреНрдпреВрдПрд▓ рдХрдорд╛рдВрдб рд╕реЗ рд╣реИ, https://gist.github рджреЗрдЦреЗрдВред com/mangecoeur/1fbd63d4758c2ba0c470#file-pandas_postgres-py)ред рдЗрд╕рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдЖрдк рдмрд╕ PgSQLDatabase(engine, <args>).to_sql(frame, name,<kwargs>) . рдХрд░реЗрдВ

рд╕рд┐рд░реНрдл рд╕рдВрджрд░реНрдн рдХреЗ рд▓рд┐рдП, рдореИрдВрдиреЗ рдорд▓реНрдЯреАрд░реЛ рдлреАрдЪрд░ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдХреЗ @jorisvandenbossche (3 рджрд┐рд╕рдВрдмрд░ рдкреЛрд╕реНрдЯ) рджреНрд╡рд╛рд░рд╛ рдХреЛрдб рдЪрд▓рд╛рдиреЗ рдХрд╛ рдкреНрд░рдпрд╛рд╕ рдХрд┐рдпрд╛ред рдпрд╣ рдХрд╛рдлреА рдзреАрдорд╛ рд╣реИред рддреЛ рдпрд╣рд╛рдБ рдЧрддрд┐-рд╡реНрдпрд╛рдкрд╛рд░ рддреБрдЪреНрдЫ рдирд╣реАрдВ рд╣реИ:

In [4]: engine = create_engine('sqlite:///:memory:') #, echo='debug')

In [5]: df = pd.DataFrame(np.random.randn(50000, 10))

In [6]: 

In [6]: %timeit df.to_sql('test_default', engine, if_exists='replace')
1 loops, best of 3: 1.05 s per loop

In [7]: 

In [7]: from pandas.io.sql import SQLTable

In [8]: 

In [8]: def _execute_insert(self, conn, keys, data_iter):
   ...:         data = [dict((k, v) for k, v in zip(keys, row)) for row in data_iter]
   ...:         conn.execute(self.insert_statement().values(data))
   ...:     

In [9]: SQLTable._execute_insert = _execute_insert

In [10]: 

In [10]: reload(pd)
Out[10]: <module 'pandas' from '/usr/local/lib/python2.7/site-packages/pandas/__init__.pyc'>

In [11]: 

In [11]: %timeit df.to_sql('test_default', engine, if_exists='replace', chunksize=10)
1 loops, best of 3: 9.9 s per loop

рд╕рд╛рде рд╣реА, рдореИрдВ рдорд╛рдирддрд╛ рд╣реВрдВ рдХрд┐ рдХреАрд╡рд░реНрдб рдкреИрд░рд╛рдореАрдЯрд░ рдЬреЛрдбрд╝рдирд╛ рдЬреЛрдЦрд┐рдо рднрд░рд╛ рд╣реИред рд╣рд╛рд▓рд╛рдБрдХрд┐, рдорд▓реНрдЯреАрд░реЛ рдлреАрдЪрд░ рдХрд╛рдлреА рдореМрд▓рд┐рдХ рд▓рдЧрддрд╛ рд╣реИред рд╕рд╛рде рд╣реА, 'рдордВрдХреА-рдкреИрдЪрд┐рдВрдЧ' рд╢рд╛рдпрдж рдХреАрд╡рд░реНрдб рдкреИрд░рд╛рдореАрдЯрд░ рдХреА рддреБрд▓рдирд╛ рдореЗрдВ рдПрдкреАрдЖрдИ рдкрд░рд┐рд╡рд░реНрддрдиреЛрдВ рдХреЗ рд▓рд┐рдП рдЕрдзрд┐рдХ рдордЬрдмреВрдд рдирд╣реАрдВ рд╣реИред

рдЬреИрд╕рд╛ рдХрд┐ рдореБрдЭреЗ рд╕рдВрджреЗрд╣ рдерд╛ред рдордВрдХреА рдкреИрдЪрд┐рдВрдЧ рд╡рд╣ рд╕рдорд╛рдзрд╛рди рдирд╣реАрдВ рд╣реИ рдЬрд┐рд╕рдХрд╛ рдореИрдВ рд╕реБрдЭрд╛рд╡ рджреЗ рд░рд╣рд╛ рдерд╛ - рдмрд▓реНрдХрд┐ рдпрд╣ рдХрд┐ рд╣рдо рдХрдИ рдкреНрд░рджрд░реНрд╢рди рдЙрдиреНрдореБрдЦ рдЙрдкрд╡рд░реНрдЧреЛрдВ рдХреЛ рд╢рд┐рдк рдХрд░рддреЗ рд╣реИрдВ рдЬрд┐рдиреНрд╣реЗрдВ рд╕реВрдЪрд┐рдд рдЙрдкрдпреЛрдЧрдХрд░реНрддрд╛ OO рдЗрдВрдЯрд░рдлрд╝реЗрд╕ рдХреЗ рдорд╛рдзреНрдпрдо рд╕реЗ рдЙрдкрдпреЛрдЧ рдХрд░ рд╕рдХрддрд╛ рд╣реИ (рдмрд╣реБрдд рд╕рд╛рд░реЗ рд╡рд┐рдХрд▓реНрдкреЛрдВ рдХреЗ рд╕рд╛рде рдХрд╛рд░реНрдпрд╛рддреНрдордХ рдПрдкреАрдЖрдИ рд▓реЛрдб рдХрд░рдиреЗ рд╕реЗ рдмрдЪрдиреЗ рдХреЗ рд▓рд┐рдП)

-----рд╡рд╛рд╕реНрддрд╡рд┐рдХ рд╕рдиреНрджреЗрд╢-----
рд╕реЗ: "рдЖрд░реНрдЯреЗрдореА рдХреЛрд▓реНрдЪрд┐рдВрд╕реНрдХреА" рд╕реВрдЪрдирд╛рдПрдВ @github.com
рднреЗрдЬрд╛ рдЧрдпрд╛: 26/тАО02/тАО2015 17:13
рдкреНрд░рддрд┐: "pydata/pandas" [email protected]
рд╕реАрд╕реА: "рдордВрдЧреЗрдХреЛрдпреВрд░" рдЬреЙрдиред рдЪреИрдореНрдмрд░реНрд╕[email protected]
рд╡рд┐рд╖рдп: рдкреБрди: [рдкрдВрдбреЛрдВ] to_sqlover рдЙрдЪреНрдЪ рд╡рд┐рд▓рдВрдмрддрд╛ рдХрдиреЗрдХреНрд╢рди (#8953) рдкрд░ рдмрдбрд╝реЗ рдкреИрдорд╛рдиреЗ рдкрд░ рдЧрддрд┐ рдХреЗ рд▓рд┐рдП рдмрд╣реБ-рдкрдВрдХреНрддрд┐ рд╕рдореНрдорд┐рд▓рди рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░реЗрдВ

рд╕рд┐рд░реНрдл рд╕рдВрджрд░реНрдн рдХреЗ рд▓рд┐рдП, рдореИрдВрдиреЗ рдорд▓реНрдЯреАрд░реЛ рдлреАрдЪрд░ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдХреЗ @jorisvandenbossche (3 рджрд┐рд╕рдВрдмрд░ рдкреЛрд╕реНрдЯ) рджреНрд╡рд╛рд░рд╛ рдХреЛрдб рдЪрд▓рд╛рдиреЗ рдХрд╛ рдкреНрд░рдпрд╛рд╕ рдХрд┐рдпрд╛ред рдпрд╣ рдХрд╛рдлреА рдзреАрдорд╛ рд╣реИред рддреЛ рдпрд╣рд╛рдБ рдЧрддрд┐-рд╡реНрдпрд╛рдкрд╛рд░ рддреБрдЪреНрдЫ рдирд╣реАрдВ рд╣реИ:
[4] рдореЗрдВ: рдЗрдВрдЬрди = create_engine ('рд╕реНрдХреНрд▓рд╛рдЗрдЯ: ///: рдореЗрдореЛрд░реА:') #, рдЗрдХреЛ = 'рдбреАрдмрдЧ')

[5] рдореЗрдВ: df = pd.DataFrame(np.random.randn(50000, 10))

[6] рдореЗрдВ:

[6] рдореЗрдВ: %timeit df.to_sql('test_default', engine, if_exists='replace')
1 рд▓реВрдк, рд╕рд░реНрд╡реЛрддреНрддрдо 3: 1.05 рд╕реЗрдХреЗрдВрдб рдкреНрд░рддрд┐ рд▓реВрдк

[7] рдореЗрдВ:

[7] рдореЗрдВ: pandas.io.sql рд╕реЗ SQLTable рдЖрдпрд╛рдд рдХрд░реЗрдВ

[8] рдореЗрдВ:

[8] рдореЗрдВ: def _execute_insert(self, conn, keys, data_iter):
...: рдбреЗрдЯрд╛ = [рддрд╛рдирд╛рд╢рд╛рд╣реА ((рдХреЗ, рд╡реА) рдХреЗ рд▓рд┐рдП, рд╡реА рдЬрд╝рд┐рдк рдореЗрдВ (рдХреБрдВрдЬреА, рдкрдВрдХреНрддрд┐)) data_iter рдореЗрдВ рдкрдВрдХреНрддрд┐ рдХреЗ рд▓рд┐рдП]
...: conn.execute (self.insert_statement ()ред рдорд╛рди (рдбреЗрдЯрд╛))
...:

[9] рдореЗрдВ: SQLTable._execute_insert = _execute_insert

[10] рдореЗрдВ:

[10] рдореЗрдВ: рдкреБрдирдГ рд▓реЛрдб (рдкреАрдбреА)
рдЖрдЙрдЯ [10]:

[11] рдореЗрдВ:

[11] рдореЗрдВ: %timeit df.to_sql('test_default', engine, if_exists='replace', chunksize=10)
1 рд▓реВрдк, рд╕рд░реНрд╡рд╢реНрд░реЗрд╖реНрда 3: 9.9 рд╕реЗрдХрдВрдб рдкреНрд░рддрд┐ рд▓реВрдк
рд╕рд╛рде рд╣реА, рдореИрдВ рдорд╛рдирддрд╛ рд╣реВрдВ рдХрд┐ рдХреАрд╡рд░реНрдб рдкреИрд░рд╛рдореАрдЯрд░ рдЬреЛрдбрд╝рдирд╛ рдЬреЛрдЦрд┐рдо рднрд░рд╛ рд╣реИред рд╣рд╛рд▓рд╛рдБрдХрд┐, рдорд▓реНрдЯреАрд░реЛ рдлреАрдЪрд░ рдХрд╛рдлреА рдореМрд▓рд┐рдХ рд▓рдЧрддрд╛ рд╣реИред рд╕рд╛рде рд╣реА, 'рдордВрдХреА-рдкреИрдЪрд┐рдВрдЧ' рд╢рд╛рдпрдж рдХреАрд╡рд░реНрдб рдкреИрд░рд╛рдореАрдЯрд░ рдХреА рддреБрд▓рдирд╛ рдореЗрдВ рдПрдкреАрдЖрдИ рдкрд░рд┐рд╡рд░реНрддрдиреЛрдВ рдХреЗ рд▓рд┐рдП рдЕрдзрд┐рдХ рдордЬрдмреВрдд рдирд╣реАрдВ рд╣реИред
-
рдЗрд╕ рдИрдореЗрд▓ рдХрд╛ рд╕реАрдзреЗ рдЙрддреНрддрд░ рджреЗрдВ рдпрд╛ рдЗрд╕реЗ GitHub рдкрд░ рджреЗрдЦреЗрдВред

рдкреНрд░рд╛рд░рдВрднрд┐рдХ рдЯрд┐рдХрдЯ рд╢реАрд░реНрд╖рдХ рдХреЗ рдЕрдиреБрд╕рд╛рд░, рдореБрдЭреЗ рдирд╣реАрдВ рд▓рдЧрддрд╛ рдХрд┐ рдпрд╣ рджреГрд╖реНрдЯрд┐рдХреЛрдг рд╕рднреА рдорд╛рдорд▓реЛрдВ рдореЗрдВ рдмреЗрд╣рддрд░ рд╣реЛрдЧрд╛, рдЗрд╕рд▓рд┐рдП рдореИрдВ рдЗрд╕реЗ рдбрд┐рдлрд╝реЙрд▓реНрдЯ рдирд╣реАрдВ рдмрдирд╛рдКрдВрдЧрд╛ред рд╣рд╛рд▓рд╛рдВрдХрд┐, рдЗрд╕рдХреЗ рдмрд┐рдирд╛, рдкрд╛рдВрдбрд╛ to_sql рдореЗрд░реЗ рд▓рд┐рдП рдЕрдиреБрдкрдпреЛрдЧреА рд╣реИрдВ, рдЗрд╕рд▓рд┐рдП рдореЗрд░реЗ рд▓рд┐рдП рдкрд░рд┐рд╡рд░реНрддрди рдХрд╛ рдЕрдиреБрд░реЛрдз рдХрд░рдирд╛ рдЬрд╛рд░реА рд░рдЦрдирд╛ рдХрд╛рдлреА рдорд╣рддреНрд╡рдкреВрд░реНрдг рд╣реИред (рдЬрдм рдореИрдВ рдЕрдкрдиреЗ рдкрд╛рдВрдбрд╛ рд╕рдВрд╕реНрдХрд░рдг рдХреЛ рдЕрдкрдЧреНрд░реЗрдб рдХрд░рддрд╛ рд╣реВрдВ рддреЛ рдпрд╣ рдкрд╣рд▓реА рдЪреАрдЬ рдмрди рдЬрд╛рддреА рд╣реИ)ред рд╕рдордЭрджрд╛рд░ chunksize рдореВрд▓реНрдпреЛрдВ рдХреЗ рд▓рд┐рдП, рдореБрдЭреЗ рдирд╣реАрдВ рд▓рдЧрддрд╛ рдХрд┐ рдПрдХ рд╕рд╣реА n рд╣реИ, рдХреНрдпреЛрдВрдХрд┐ рдкреИрдХреЗрдЯ рдХрд╛ рдЖрдХрд╛рд░ рдЗрд╕ рдмрд╛рдд рдкрд░ рдирд┐рд░реНрднрд░ рдХрд░реЗрдЧрд╛ рдХрд┐ рдХрд┐рддрдиреЗ рдХреЙрд▓рдо рд╣реИрдВ (рдФрд░ рдЙрдирдореЗрдВ рдХреНрдпрд╛ рд╣реИ) рднрд╡рд┐рд╖реНрдпрд╡рд╛рдгреА рдХрд░рдиреЗ рдХреЗ рддрд░реАрдХреЛрдВ рдореЗрдВ рдореБрд╢реНрдХрд┐рд▓ рд╣реИ . рджреБрд░реНрднрд╛рдЧреНрдп рд╕реЗ SQLServer рдПрдХ рддреНрд░реБрдЯрд┐ рд╕рдВрджреЗрд╢ рдХреЗ рд╕рд╛рде рд╡рд┐рдлрд▓ рд╣реЛ рдЬрд╛рддрд╛ рд╣реИ рдЬреЛ рдкреВрд░реА рддрд░рд╣ рд╕реЗ рдЕрд╕рдВрдмрдВрдзрд┐рдд рджрд┐рдЦрддрд╛ рд╣реИ (рд▓реЗрдХрд┐рди рдирд╣реАрдВ рд╣реИ) рдпрджрд┐ рдЖрдк chunksize рдмрд╣реБрдд рдЕрдзрд┐рдХ рд╕реЗрдЯ рдХрд░рддреЗ рд╣реИрдВ (рд╢рд╛рдпрдж рдпрд╣реА рдХрд╛рд░рдг рд╣реИ рдХрд┐ SQLAlchemy рдореЗрдВ рдПрдХ рдкреИрдЪ рдХреЛ рдЫреЛрдбрд╝рдХрд░ рдорд▓реНрдЯреАрд░реЛ рдЗрдВрд╕рд░реНрдЯ рдЪрд╛рд▓реВ рдирд╣реАрдВ рд╣реЛрддреЗ рд╣реИрдВ), рд▓реЗрдХрд┐рди рдпрд╣ mysql рдХреЗ рд╕рд╛рде рдареАрдХ рдХрд╛рдо рдХрд░рддрд╛ рд╣реИред рдЙрдкрдпреЛрдЧрдХрд░реНрддрд╛рдУрдВ рдХреЛ рдпрд╣ рдирд┐рд░реНрдзрд╛рд░рд┐рдд рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдкреНрд░рдпреЛрдЧ рдХрд░рдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реЛ рд╕рдХрддреА рд╣реИ рдХрд┐ n рдХрд╛ рдХреМрди рд╕рд╛ рдореВрд▓реНрдп рд╕реНрд╡реАрдХрд╛рд░реНрдп рд░реВрдк рд╕реЗ рдмрдбрд╝реЗ рдкреИрдХреЗрдЯ рдЖрдХрд╛рд░ рдореЗрдВ рдкрд░рд┐рдгрд╛рдорд┐рдд рд╣реЛ рд╕рдХрддрд╛ рд╣реИ (рдЙрдирдХреЗ рдмреИрдХрд┐рдВрдЧ рдбреЗрдЯрд╛рдмреЗрд╕ рдЬреЛ рднреА рд╣реЛ)ред рдкрдВрдбреЛрдВ рдиреЗ n рдХреЛ рдЪреБрдирд╛ рд╣реИ, рдЗрд╕рд╕реЗ рд╣рдореЗрдВ рдХрд╛рд░реНрдпрд╛рдиреНрд╡рдпрди рд╡рд┐рд╡рд░рдг рдореЗрдВ рдЬрдореАрди рдорд┐рд▓рдиреЗ рдХреА рд╕рдВрднрд╛рд╡рдирд╛ рд╣реИ, рдЬрд┐рддрдирд╛ рд╣рдо рдЪрд╛рд╣рддреЗ рд╣реИрдВ (рдпрд╛рдиреА рдЕрдзрд┐рдХрддрдо-рд╕рдВрднрд╡-рдЕрдореВрд░реНрдд SQLALchemy рджреГрд╖реНрдЯрд┐рдХреЛрдг рд╕реЗ рд╡рд┐рдкрд░реАрдд рджрд┐рд╢рд╛)

рд╕рдВрдХреНрд╖реЗрдк рдореЗрдВ, рдореЗрд░реА рд╕рд┐рдлрд╛рд░рд┐рд╢ рд╣реЛрдЧреА рдХрд┐ рдЗрд╕реЗ рдПрдХ рдХреАрд╡рд░реНрдб рдХреЗ рд░реВрдк рдореЗрдВ рдЬреЛрдбрд╝рд╛ рдЬрд╛рдП, рдЗрд╕рдХреЗ рдЙрдкрдпреЛрдЧ рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рдХреБрдЫ рдЙрдкрдпреЛрдЧреА рдЯрд┐рдкреНрдкрдгреА рдХреЗ рд╕рд╛рдеред рдпрд╣ рдкрд╣рд▓реА рдмрд╛рд░ рдирд╣реАрдВ рд╣реЛрдЧрд╛ рдЬрдм рдХрд┐рд╕реА рдХреАрд╡рд░реНрдб рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд┐рд╕реА рдХрд╛рд░реНрдпрд╛рдиреНрд╡рдпрди рдХрд╛ рдЪрдпрди рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдХрд┐рдпрд╛ рдЧрдпрд╛ рдерд╛ (рджреЗрдЦреЗрдВ: http://pandas.pydata.org/pandas-docs/dev/generated/pandas.DataFrame.apply.html) рд▓реЗрдХрд┐рди рд╡рд╣ рд╢рд╛рдпрдж рд╣реИ' рд╕рдмрд╕реЗ рдЕрдЪреНрдЫрд╛ рдЙрджрд╛рд╣рд░рдг рдирд╣реАрдВ рд╣реИ, рдХреНрдпреЛрдВрдХрд┐ рдореБрдЭреЗ рдЗрд╕ рдмрд╛рд░реЗ рдореЗрдВ рдкрд╣рд▓рд╛ рд╡рд┐рдЪрд╛рд░ рдирд╣реАрдВ рд╣реИ рдХрд┐ raw= рдХрд╛ рдХреНрдпрд╛ рдЕрд░реНрде рд╣реИ, рдпрд╣рд╛рдВ рддрдХ тАЛтАЛрдХрд┐ рд╕реНрдкрд╖реНрдЯреАрдХрд░рдг рдкрдврд╝рдиреЗ рдХреЗ рдмрд╛рдж рднреА!

рдореИрдВрдиреЗ рджреЗрдЦрд╛ рд╣реИ рдХрд┐ рдпрд╣ рдмрд╣реБрдд рдмрдбрд╝реА рдорд╛рддреНрд░рд╛ рдореЗрдВ рд╕реНрдореГрддрд┐ рдХрд╛ рднреА рдЙрдкрднреЛрдЧ рдХрд░рддрд╛ рд╣реИред рд▓рдЧрднрдЧ 700,000 рдкрдВрдХреНрддрд┐рдпреЛрдВ рдФрд░ 301 рд╕реНрддрдВрднреЛрдВ рдХреЗ рд╕рд╛рде 1.6+ рдЬреАрдмреА рдбреЗрдЯрд╛рдлрд╝реНрд░реЗрдо рдХреА рддрд░рд╣ рдбрд╛рд▓рдиреЗ рдХреЗ рджреМрд░рд╛рди рд▓рдЧрднрдЧ 34 рдЬреАрдмреА рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реЛрддреА рд╣реИ! рдпрд╣ рд╢реАрд░реНрд╖ рдЕрдХреНрд╖рдо рдХреА рддрд░рд╣ рд╣реИред рдРрд╕рд╛ рдХреНрдпреЛрдВ рд╣реЛ рд╕рдХрддрд╛ рд╣реИ рдкрд░ рдХреЛрдИ рд╡рд┐рдЪрд╛рд░? рдпрд╣рд╛рдБ рдПрдХ рд╕реНрдХреНрд░реАрди рдХреНрд▓рд┐рдк рд╣реИ:

image

рд╣рд╛рдп рджреЛрд╕реНрддреЛрдВ,
рдЗрд╕ рдореБрджреНрджреЗ рдкрд░ рдХреЛрдИ рдкреНрд░рдЧрддрд┐?

рдореИрдВ to_sql рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдХреЗ рд▓рдЧрднрдЧ 200K рдкрдВрдХреНрддрд┐рдпреЛрдВ рдХреЛ рд╕рдореНрдорд┐рд▓рд┐рдд рдХрд░рдиреЗ рдХрд╛ рдкреНрд░рдпрд╛рд╕ рдХрд░ рд░рд╣рд╛ рд╣реВрдВ рд▓реЗрдХрд┐рди рдпрд╣ рд╣рдореЗрд╢рд╛ рдХреЗ рд▓рд┐рдП рд▓реЗрддрд╛ рд╣реИ рдФрд░ рдмрдбрд╝реА рдорд╛рддреНрд░рд╛ рдореЗрдВ рд╕реНрдореГрддрд┐ рдХрд╛ рдЙрдкрднреЛрдЧ рдХрд░рддрд╛ рд╣реИ! рдЪрдВрдХреНрд╕рд╛рдЗрдЬрд╝ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдиреЗ рд╕реЗ рд╕реНрдореГрддрд┐ рдореЗрдВ рдорджрдж рдорд┐рд▓рддреА рд╣реИ рд▓реЗрдХрд┐рди рдлрд┐рд░ рднреА рдЧрддрд┐ рдмрд╣реБрдд рдзреАрдореА рд╣реЛрддреА рд╣реИред

рдПрдордПрд╕рдПрд╕рдХреНрдпреВрдПрд▓ рдбреАрдмреЗрд╕ рдЯреНрд░реЗрд╕ рдХреЛ рджреЗрдЦрдХрд░ рдореЗрд░реА рдзрд╛рд░рдгрд╛ рдпрд╣ рд╣реИ рдХрд┐ рд╕рдореНрдорд┐рд▓рди рд╡рд╛рд╕реНрддрд╡ рдореЗрдВ рдЙрд╕ рд╕рдордп рдПрдХ рдкрдВрдХреНрддрд┐ рдореЗрдВ рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИред

рдЕрдм рдПрдХрдорд╛рддреНрд░ рд╡реНрдпрд╡рд╣рд╛рд░реНрдп рддрд░реАрдХрд╛ рдПрдХ рд╕рд╛рдЭрд╛ рдлрд╝реЛрд▓реНрдбрд░ рдкрд░ рдПрдХ рд╕реАрдПрд╕рд╡реА рдлрд╝рд╛рдЗрд▓ рдХреЛ рдбрдВрдк рдХрд░рдирд╛ рдФрд░ рдмрд▓реНрдХ рдЗрдВрд╕рд░реНрдЯ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдирд╛ рд╣реИред рд▓реЗрдХрд┐рди рдпрд╣ рдмрд╣реБрдд рдХрд╖реНрдЯрдкреНрд░рдж рдФрд░ рд╕реБрд░реБрдЪрд┐рдкреВрд░реНрдг рд╣реИ!

@andreacassioli рдЖрдк рдордзреНрдпрд╕реНрде CSV рдлрд╝рд╛рдЗрд▓ рдХреЗ рдорд╛рдзреНрдпрдо рд╕реЗ SQL рдбреЗрдЯрд╛рдмреЗрд╕ рдореЗрдВ рдбреЗрдЯрд╛рдлрд╝реНрд░реЗрдо рд╕рдореНрдорд┐рд▓рд┐рдд рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП odo рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВред SQL рдбреЗрдЯрд╛рдмреЗрд╕ рдореЗрдВ CSV рд▓реЛрдб рдХрд░рдирд╛ рджреЗрдЦреЗрдВред

рдореБрдЭреЗ рдирд╣реАрдВ рд▓рдЧрддрд╛ рдХрд┐ рдЖрдк ODBC рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдХреЗ BULK INSERT рдкреНрд░рджрд░реНрд╢рди рдХреЗ рдХрд░реАрдм рднреА рдЖ рд╕рдХрддреЗ рд╣реИрдВред

@ostrokach рдзрдиреНрдпрд╡рд╛рдж, рд╡рд╛рд╕реНрддрд╡ рдореЗрдВ рдореИрдВ рдЕрдм рд╕реАрдПрд╕рд╡реА рдлрд╛рдЗрд▓реЛрдВ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░ рд░рд╣рд╛ рд╣реВрдВред рдЕрдЧрд░ рдореИрдВ рдкрд╛рд╕ рд╣реЛ рдкрд╛рддрд╛, рддреЛ рдореИрдВ рд╕рд╛рджрдЧреА рдХреЗ рд▓рд┐рдП рдереЛрдбрд╝рд╛ рд╕рдордп рджреЗрддрд╛!

рдореИрдВрдиреЗ рд╕реЛрдЪрд╛ рдХрд┐ рдпрд╣ рдХрд┐рд╕реА рдХреА рдорджрдж рдХрд░ рд╕рдХрддрд╛ рд╣реИ:
http://docs.sqlalchemy.org/hi/latest/faq/performance.html#i -m-inserting-400-000-rows-with-the-orm-and-it-s-really-slow

@indera рдкрд╛рдВрдбрд╛ ORM рдХрд╛ рдЙрдкрдпреЛрдЧ рдирд╣реАрдВ рдХрд░рддреЗ рд╣реИрдВ, рдХреЗрд╡рд▓ sqlalchemy Core (рдЬреЛ рдХрд┐ рд╡рд╣рд╛рдБ рджрд╕реНрддрд╛рд╡реЗрдЬрд╝ рдкреНрд░рд╡рд┐рд╖реНрдЯрд┐ рд╣реИ рдЬреЛ рдмрдбрд╝реЗ рдЖрд╡реЗрд╖рдг рдХреЗ рд▓рд┐рдП рдЙрдкрдпреЛрдЧ рдХрд░рдиреЗ рдХрд╛ рд╕реБрдЭрд╛рд╡ рджреЗрддреА рд╣реИ)

рдЗрд╕ рдмреАрдЪ рдЗрд╕ рдкрд░ рдХреИрд╕реЗ рдХрд╛рдо рдХрд┐рдпрд╛ рдЬрд╛рдП, рдЗрд╕ рдкрд░ рдХреЛрдИ рд╕рд╣рдорддрд┐ рд╣реИ? рдореИрдВ рдкреЛрд╕реНрдЯрдЧреНрд░реЗрдЬрд╝ рдореЗрдВ рдХрдИ рдорд┐рд▓рд┐рдпрди рдкрдВрдХреНрддрд┐рдпрд╛рдБ рд╕рдореНрдорд┐рд▓рд┐рдд рдХрд░ рд░рд╣рд╛ рд╣реВрдБ рдФрд░ рдЗрд╕рдореЗрдВ рд╣рдореЗрд╢рд╛ рдХреЗ рд▓рд┐рдП рд▓рдЧ рдЬрд╛рддрд╛ рд╣реИред рдХреНрдпрд╛ рд╕реАрдПрд╕рд╡реА/рдУрдбреЛ рдЬрд╛рдиреЗ рдХрд╛ рд░рд╛рд╕реНрддрд╛ рд╣реИ?

@russlamb рдЗрд╕ рд╕рдорд╕реНрдпрд╛ рдХреЛ рд╣рд▓ рдХрд░рдиреЗ рдХрд╛ рдПрдХ рд╡реНрдпрд╛рд╡рд╣рд╛рд░рд┐рдХ рддрд░реАрдХрд╛ рдХреЗрд╡рд▓ рдмрд▓реНрдХ рдЕрдкрд▓реЛрдб рдХрд░рдирд╛ рд╣реИред рд╣рд╛рд▓рд╛рдВрдХрд┐ рдпрд╣ рдХреЛрдИ рдбреАрдмреА рд╡рд┐рд╢рд┐рд╖реНрдЯ рд╣реИ, рдЗрд╕рд▓рд┐рдП odo рдореЗрдВ postgresl рдХреЗ рд╕рдорд╛рдзрд╛рди рд╣реИрдВ (рдФрд░ mysql рд╣реЛ рд╕рдХрддрд╛ рд╣реИ) рдореБрдЭреЗ рд▓рдЧрддрд╛ рд╣реИред sqlserver рдЬреИрд╕реА рдХрд┐рд╕реА рдЪреАрдЬрд╝ рдХреЗ рд▓рд┐рдП рдЖрдкрдХреЛ 'рдпрд╣ рд╕реНрд╡рдпрдВ рдХрд░рдирд╛ рд╣реЛрдЧрд╛' (IOW рдЖрдкрдХреЛ рдЗрд╕реЗ рд▓рд┐рдЦрдирд╛ рд╣реЛрдЧрд╛)ред

sqlserver рдХреЗ рд▓рд┐рдП рдореИрдВрдиреЗ SQLAlchemy рд╕рдВрд╕реНрдерд╛рдУрдВ рдХреЗ рд╕рд╛рде FreeTDS рдбреНрд░рд╛рдЗрд╡рд░ (http://www.freetds.org/software.html рдФрд░ https://github.com/mkleehammer/pyodbc) рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд┐рдпрд╛, рдЬрд┐рд╕рдХреЗ рдкрд░рд┐рдгрд╛рдорд╕реНрд╡рд░реВрдк рдмрд╣реБрдд рддреЗрдЬрд╝ рдЖрд╡реЗрд╖рдг (рдкреНрд░рддрд┐ рдбреЗрдЯрд╛ рдлрд╝реНрд░реЗрдо рдореЗрдВ 20K рдкрдВрдХреНрддрд┐рдпрд╛рдБ) :

from sqlalchemy.ext.declarative import declarative_base
Base = declarative_base()


class DemographicEntity(Base):
    __tablename__ = 'DEMOGRAPHIC'

    patid = db.Column("PATID", db.Text, primary_key=True)
    """
    patid = db.Column("PATID", db.Text, primary_key=True, autoincrement=False, nullable=True)
    birth_date = db.Column("BIRTH_DATE", db.Date)
    birth_time = db.Column("BIRTH_TIME", db.Text(5))
    sex = db.Column("SEX", db.Text(2))

def get_db_url(db_host, db_port, db_name, db_user, db_pass):
    params = parse.quote(
        "Driver={{FreeTDS}};Server={};Port={};"
        "Database={};UID={};PWD={};"
        .format(db_host, db_port, db_name, db_user, db_pass))
    return 'mssql+pyodbc:///?odbc_connect={}'.format(params)

def get_db_pool():
    """
    Create the database engine connection.
    <strong i="6">@see</strong> http://docs.sqlalchemy.org/en/latest/core/engines.html

    :return: Dialect object which can either be used directly
            to interact with the database, or can be passed to
            a Session object to work with the ORM.
    """
    global DB_POOL

    if DB_POOL is None:
        url = get_db_url(db_host=DB_HOST, db_port=DB_PORT, db_name=DB_NAME,
                         db_user=DB_USER, db_pass=DB_PASS)
        DB_POOL = db.create_engine(url,
                                   pool_size=10,
                                   max_overflow=5,
                                   pool_recycle=3600)

    try:
        DB_POOL.execute("USE {db}".format(db=DB_NAME))
    except db.exc.OperationalError:
        logger.error('Database {db} does not exist.'.format(db=DB_NAME))

    return DB_POOL


def save_frame():
    db_pool = get_db_pool()
    records = df.to_dict(orient='records')
    result = db_pool.execute(entity.__table__.insert(), records)

рдХреНрдпрд╛ рд╕реАрдПрд╕рд╡реА/рдУрдбреЛ рдЬрд╛рдиреЗ рдХрд╛ рд░рд╛рд╕реНрддрд╛ рд╣реИ?

рдмрд╣реБ-рдкрдВрдХреНрддрд┐/рдЦрдВрдб рдЖрдХрд╛рд░ рд╕реЗрдЯрд┐рдВрдЧреНрд╕ рдХреЗ рдмрд╛рд╡рдЬреВрдж, рдпрд╣ рд╕рдорд╛рдзрд╛рди рд▓рдЧрднрдЧ рд╣рдореЗрд╢рд╛ рддреЗрдЬрд╝ рд╣реЛрдЧрд╛ред

рд▓реЗрдХрд┐рди, @russlamb , рдпрд╣ рд╕реБрдирдирд╛ рд╣рдореЗрд╢рд╛ рджрд┐рд▓рдЪрд╕реНрдк рд╣реЛрддрд╛ рд╣реИ рдХрд┐ рдХреНрдпрд╛ рдРрд╕рд╛ рдмрд╣реБ-рдкрдВрдХреНрддрд┐ рдХреАрд╡рд░реНрдб рдЖрдкрдХреЗ рдорд╛рдорд▓реЗ рдореЗрдВ рд╕реБрдзрд╛рд░ рдХрд░реЗрдЧрд╛ред рдЖрд╕рд╛рдиреА рд╕реЗ рдЗрд╕рдХрд╛ рдкрд░реАрдХреНрд╖рдг рдХрд░рдиреЗ рдХреЗ рддрд░реАрдХреЗ рдкрд░ https://github.com/pandas-dev/pandas/issues/8953#issuecomment -76139975 рджреЗрдЦреЗрдВред

рдореБрдЭреЗ рд▓рдЧрддрд╛ рд╣реИ рдХрд┐ рдЗрд╕ рдмрд╛рдд рдкрд░ рд╕рд╣рдорддрд┐ рд╣реИ рдХрд┐ рд╣рдо рдЗрд╕реЗ рдирд┐рд░реНрджрд┐рд╖реНрдЯ рдХрд░рдиреЗ рдХрд╛ рдПрдХ рддрд░реАрдХрд╛ рдЪрд╛рд╣рддреЗ рд╣реИрдВ (рдЖрд╡рд╢реНрдпрдХ рд░реВрдк рд╕реЗ рдбрд┐рдлрд╝реЙрд▓реНрдЯ рдХреЛ рдмрджрд▓реЗ рдмрд┐рдирд╛)ред рддреЛ рдЕрдЧрд░ рдХреЛрдИ рдЗрд╕рдХреЗ рд▓рд┐рдП рдкреАрдЖрд░ рдмрдирд╛рдирд╛ рдЪрд╛рд╣рддрд╛ рд╣реИ, рддреЛ рдирд┐рд╢реНрдЪрд┐рдд рд░реВрдк рд╕реЗ рдЙрд╕рдХрд╛ рд╕реНрд╡рд╛рдЧрдд рд╣реИред
рдЗрд╕ рдХреНрд╖рдорддрд╛ рдХреЛ рдХреИрд╕реЗ рдЬреЛрдбрд╝рд╛ рдЬрд╛рдП (OO api рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдХреЗ рдирдпрд╛ рдХреАрд╡рд░реНрдб рдмрдирд╛рдо рдЙрдкрд╡рд░реНрдЧ) рдкрд░ рдХреЗрд╡рд▓ рдХреБрдЫ рдЪрд░реНрдЪрд╛ рд╣реБрдИред

@jorisvandenbossche рдореИрдВрдиреЗ рдКрдкрд░ рджрд┐рдП рдЧрдП рджрд╕реНрддрд╛рд╡реЗрдЬрд╝ рдХрд╛ рдЙрд▓реНрд▓реЗрдЦ рдХрд┐рдпрд╛ рд╣реИ "рд╡реИрдХрд▓реНрдкрд┐рдХ рд░реВрдк рд╕реЗ, SQLAlchemy ORM рд╡рд┐рдзрд┐рдпреЛрдВ рдХреЗ рдмрд▓реНрдХ рдСрдкрд░реЗрд╢рдВрд╕ рд╕реВрдЯ рдкреНрд░рджрд╛рди рдХрд░рддрд╛ рд╣реИ, рдЬреЛ рдХреЛрд░-рд╕реНрддрд░реАрдп INSERT рдХрд╛ рдЙрддреНрд╕рд░реНрдЬрди рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдХрд╛рд░реНрдп рдкреНрд░рдХреНрд░рд┐рдпрд╛ рдХреА рдЗрдХрд╛рдИ рдХреЗ рдЙрдкрдЦрдВрдбреЛрдВ рдореЗрдВ рд╣реБрдХ рдкреНрд░рджрд╛рди рдХрд░рддрд╛ рд╣реИ рдФрд░ ORM рдХреА рдПрдХ рдЫреЛрдЯреА рдбрд┐рдЧреНрд░реА рдХреЗ рд╕рд╛рде рдЕрджреНрдпрддрди рдХрд░рддрд╛ рд╣реИред рдЖрдзрд╛рд░рд┐рдд рд╕реНрд╡рдЪрд╛рд▓рдиред"

рдореИрдВ рдЬреЛ рд╕реБрдЭрд╛рд╡ рджреЗ рд░рд╣рд╛ рд╣реВрдВ рд╡рд╣ to_sql рдХреЗ рд▓рд┐рдП рдПрдХ рдПрд╕рдХреНрд▓рд╕реЗрд╡рд░ рд╡рд┐рд╢рд┐рд╖реНрдЯ рд╕рдВрд╕реНрдХрд░рдг рдХреЛ рдХрд╛рд░реНрдпрд╛рдиреНрд╡рд┐рдд рдХрд░рдирд╛ рд╣реИ рдЬреЛ рд╣реБрдб рдХреЗ рддрд╣рдд рдКрдкрд░ рдкреЛрд╕реНрдЯ рдХрд┐рдП рдЧрдП рдХреЛрдб рдореЗрдВ рд╕реНрдкреАрдбрдЕрдк рдХреЗ рд▓рд┐рдП SQLAlchemy ORM рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рддрд╛ рд╣реИред

рдпрд╣ рдкрд╣рд▓реЗ рдкреНрд░рд╕реНрддрд╛рд╡рд┐рдд рдХрд┐рдпрд╛ рдЧрдпрд╛ рдерд╛ред рдЬрд┐рд╕ рддрд░рд╣ рд╕реЗ рдЖрдк рдЬрд╛рддреЗ рд╣реИрдВ рд╡рд╣ рдПрдХ рдкрд╛рдВрдбрд╛ рд╡рд░реНрдЧ рдХреЛ рд▓рд╛рдЧреВ рдХрд░рдирд╛ рд╣реИ
рдмреИрдХрдПрдВрдб рдХреЗ рд▓рд┐рдП рдЕрдиреБрдХреВрд▓рд┐рдд рд╡рд░реНрдЧред рдореИрдВрдиреЗ рдЕрддреАрдд рдореЗрдВ рдЙрдкрдпреЛрдЧ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдПрдХ рд╕рд╛рд░ рдкреЛрд╕реНрдЯ рдХрд┐рдпрд╛ рдерд╛
рдХрдорд╛рдВрдб рд╕реЗ рдХреЙрдкреА рдкреЛрд╕реНрдЯ рдХрд░рддрд╛ рд╣реИ рдЬреЛ рдмрд╣реБрдд рддреЗрдЬ рд╣реИред рд╣рд╛рд▓рд╛рдВрдХрд┐ рдХреБрдЫ рдРрд╕рд╛ рд╣реА
рдЕрдм рдУрдбреЛ рдореЗрдВ рдЙрдкрд▓рдмреНрдз рд╣реИ, рдФрд░ рдЕрдзрд┐рдХ рдордЬрдмреВрдд рддрд░реАрдХреЗ рд╕реЗ рдмрдирд╛рдпрд╛ рдЧрдпрд╛ рд╣реИред рдмрд╣реБрдд рдХреБрдЫ рдирд╣реАрдВ рд╣реИ
рдУрдбреЛ рд╕реЗ рдХрд╛рдо рдХреА рдирдХрд▓ рдХрд░рдиреЗ рдореЗрдВ рдЖрдИрдПрдордПрдЪрдУ рдХреЛ рдЗрдВрдЧрд┐рдд рдХрд░реЗрдВред

7 рдорд╛рд░реНрдЪ 2017 00:53 рдХреЛ, "рдЖрдВрджреНрд░реЗрдИ рд╕реБрд░рд╛" рдиреЛрдЯрд┐рдлрд┐рдХреЗрд╢рди @github.com рдиреЗ рд▓рд┐рдЦрд╛:

@jorisvandenbossche https://github.com/jorisvandenbossche рджрд╕реНрддрд╛рд╡реЗрдЬрд╝
рдореИрдВрдиреЗ рдКрдкрд░ рдЙрд▓реНрд▓реЗрдЦ рдХрд┐рдпрд╛ рд╣реИ "рд╡реИрдХрд▓реНрдкрд┐рдХ рд░реВрдк рд╕реЗ, SQLAlchemy ORM рдереЛрдХ рдкреНрд░рджрд╛рди рдХрд░рддрд╛ рд╣реИ"
рд╡рд┐рдзрд┐рдпреЛрдВ рдХрд╛ рд╕рдВрдЪрд╛рд▓рди рд╕реВрдЯ, рдЬреЛ рдЙрдкрдЦрдВрдбреЛрдВ рдореЗрдВ рд╣реБрдХ рдкреНрд░рджрд╛рди рдХрд░рддрд╛ рд╣реИ
рдХреЛрд░-рд▓реЗрд╡рд▓ INSERT рдФрд░ UPDATE рдХрд╛ рдЙрддреНрд╕рд░реНрдЬрди рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдХрд╛рд░реНрдп рдкреНрд░рдХреНрд░рд┐рдпрд╛ рдХреА рдЗрдХрд╛рдИ
рдУрдЖрд░рдПрдо-рдЖрдзрд╛рд░рд┐рдд рд╕реНрд╡рдЪрд╛рд▓рди рдХреА рдПрдХ рдЫреЛрдЯреА рдбрд┐рдЧреНрд░реА рдХреЗ рд╕рд╛рде рдирд┐рд░реНрдорд╛рдг рдХрд░рддрд╛ рд╣реИред"

рдореИрдВ рдЬреЛ рд╕реБрдЭрд╛рд╡ рджреЗ рд░рд╣рд╛ рд╣реВрдВ рд╡рд╣ рд╣реИ sqlserver рд╡рд┐рд╢рд┐рд╖реНрдЯ рд╕рдВрд╕реНрдХрд░рдг рдХреЛ рд▓рд╛рдЧреВ рдХрд░рдирд╛
"to_sql" рдЬреЛ рд╣реБрдб рдХреЗ рдиреАрдЪреЗ рд╕реНрдкреАрдбрдЕрдк рдХреЗ рд▓рд┐рдП SQLAlchemy рдХреЛрд░ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рддрд╛ рд╣реИред

-
рдЖрдк рдЗрд╕реЗ рдкреНрд░рд╛рдкреНрдд рдХрд░ рд░рд╣реЗ рд╣реИрдВ рдХреНрдпреЛрдВрдХрд┐ рдЖрдкрдХрд╛ рдЙрд▓реНрд▓реЗрдЦ рдХрд┐рдпрд╛ рдЧрдпрд╛ рдерд╛ред
рдЗрд╕ рдИрдореЗрд▓ рдХрд╛ рд╕реАрдзреЗ рдЙрддреНрддрд░ рджреЗрдВ, рдЗрд╕реЗ GitHub рдкрд░ рджреЗрдЦреЗрдВ
https://github.com/pandas-dev/pandas/issues/8953#issuecomment-284437587 ,
рдпрд╛ рдереНрд░реЗрдб рдХреЛ рдореНрдпреВрдЯ рдХрд░реЗрдВ
https://github.com/notifications/unsubscribe-auth/AAtYVDXKLuTlsh9ycpMQvU5C0hs_RxuYks5rjCwBgaJpZM4DCjLh
.

рдпрд╣ рднреА рджреЗрдЦрд╛ рдХрд┐ рдЖрдкрдиреЗ рдЙрд▓реНрд▓реЗрдЦ рдХрд┐рдпрд╛ рд╣реИ рдХрд┐ sqlalchemy рдЗрд╕рдХреЗ рдмрдЬрд╛рдп рдХреЛрд░ рд╣реЛ рд╕рдХрддрд╛ рд╣реИред рдЬрдм рддрдХ рдХреБрдЫ
рдмрд╣реБрдд рдХреБрдЫ рдмрджрд▓ рдЧрдпрд╛ рд╣реИ, рдХрд┐рд╕реА рднреА рдорд╛рдорд▓реЗ рдореЗрдВ рдХреЗрд╡рд▓ sqlalchemy рдХреЛрд░ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ, рдХреЛрдИ рдУрдЖрд░рдПрдо рдирд╣реАрдВред рдЕрдЧрд░ рддреБрдо
рдХреЛрд░ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдиреЗ рд╕реЗ рдЕрдзрд┐рдХ рдЧрддрд┐ рдХрд░рдирд╛ рдЪрд╛рд╣рддреЗ рд╣реИрдВ, рдЖрдкрдХреЛ рдирд┐рдЪрд▓реЗ рд╕реНрддрд░ рдкрд░ рдЬрд╛рдирд╛ рд╣реЛрдЧрд╛, рдбреАрдмреА
рд╡рд┐рд╢рд┐рд╖реНрдЯ рдЕрдиреБрдХреВрд▓рди

7 рдорд╛рд░реНрдЪ 2017 00:53 рдХреЛ, "рдЖрдВрджреНрд░реЗрдИ рд╕реБрд░рд╛" рдиреЛрдЯрд┐рдлрд┐рдХреЗрд╢рди @github.com рдиреЗ рд▓рд┐рдЦрд╛:

@jorisvandenbossche https://github.com/jorisvandenbossche рджрд╕реНрддрд╛рд╡реЗрдЬрд╝
рдореИрдВрдиреЗ рдКрдкрд░ рдЙрд▓реНрд▓реЗрдЦ рдХрд┐рдпрд╛ рд╣реИ "рд╡реИрдХрд▓реНрдкрд┐рдХ рд░реВрдк рд╕реЗ, SQLAlchemy ORM рдереЛрдХ рдкреНрд░рджрд╛рди рдХрд░рддрд╛ рд╣реИ"
рд╡рд┐рдзрд┐рдпреЛрдВ рдХрд╛ рд╕рдВрдЪрд╛рд▓рди рд╕реВрдЯ, рдЬреЛ рдЙрдкрдЦрдВрдбреЛрдВ рдореЗрдВ рд╣реБрдХ рдкреНрд░рджрд╛рди рдХрд░рддрд╛ рд╣реИ
рдХреЛрд░-рд▓реЗрд╡рд▓ INSERT рдФрд░ UPDATE рдХрд╛ рдЙрддреНрд╕рд░реНрдЬрди рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдХрд╛рд░реНрдп рдкреНрд░рдХреНрд░рд┐рдпрд╛ рдХреА рдЗрдХрд╛рдИ
рдУрдЖрд░рдПрдо-рдЖрдзрд╛рд░рд┐рдд рд╕реНрд╡рдЪрд╛рд▓рди рдХреА рдПрдХ рдЫреЛрдЯреА рдбрд┐рдЧреНрд░реА рдХреЗ рд╕рд╛рде рдирд┐рд░реНрдорд╛рдг рдХрд░рддрд╛ рд╣реИред"

рдореИрдВ рдЬреЛ рд╕реБрдЭрд╛рд╡ рджреЗ рд░рд╣рд╛ рд╣реВрдВ рд╡рд╣ рд╣реИ sqlserver рд╡рд┐рд╢рд┐рд╖реНрдЯ рд╕рдВрд╕реНрдХрд░рдг рдХреЛ рд▓рд╛рдЧреВ рдХрд░рдирд╛
"to_sql" рдЬреЛ рд╣реБрдб рдХреЗ рдиреАрдЪреЗ рд╕реНрдкреАрдбрдЕрдк рдХреЗ рд▓рд┐рдП SQLAlchemy рдХреЛрд░ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рддрд╛ рд╣реИред

-
рдЖрдк рдЗрд╕реЗ рдкреНрд░рд╛рдкреНрдд рдХрд░ рд░рд╣реЗ рд╣реИрдВ рдХреНрдпреЛрдВрдХрд┐ рдЖрдкрдХрд╛ рдЙрд▓реНрд▓реЗрдЦ рдХрд┐рдпрд╛ рдЧрдпрд╛ рдерд╛ред
рдЗрд╕ рдИрдореЗрд▓ рдХрд╛ рд╕реАрдзреЗ рдЙрддреНрддрд░ рджреЗрдВ, рдЗрд╕реЗ GitHub рдкрд░ рджреЗрдЦреЗрдВ
https://github.com/pandas-dev/pandas/issues/8953#issuecomment-284437587 ,
рдпрд╛ рдереНрд░реЗрдб рдХреЛ рдореНрдпреВрдЯ рдХрд░реЗрдВ
https://github.com/notifications/unsubscribe-auth/AAtYVDXKLuTlsh9ycpMQvU5C0hs_RxuYks5rjCwBgaJpZM4DCjLh
.

рдХреНрдпрд╛ рдЗрд╕реЗ рдареАрдХ рдХрд┐рдпрд╛ рдЬрд╛ рд░рд╣рд╛ рд╣реИ/рдЗрд╕рдХрд╛ рдзреНрдпрд╛рди рд░рдЦрд╛ рдЬрд╛ рд░рд╣рд╛ рд╣реИ? рдЬрдм рддрдХ рдпрд╣ рдПрдХ рдЦрд┐рд▓реМрдирд╛ рдбреЗрдЯрд╛рдлрд╝реНрд░реЗрдо рди рд╣реЛ, рддрдм рддрдХ SQL db рдореЗрдВ рдкрд╛рдВрдбрд╛ рдбреЗрдЯрд╛рдлрд╝реНрд░реЗрдо рд╕рдореНрдорд┐рд▓рд┐рдд рдХрд░рдирд╛ рдмреЗрд╣рдж рдзреАрдорд╛ рд╣реИред рдЖрдЗрдП рдПрдХ рд╕рдорд╛рдзрд╛рди рдкрд░ рдирд┐рд░реНрдгрдп рд▓реЗрдВ рдФрд░ рдЗрд╕реЗ рдЖрдЧреЗ рдмрдврд╝рд╛рдПрдВ?

@dfernan рдЬреИрд╕рд╛ рдКрдкрд░ рдмрддрд╛рдпрд╛ рдЧрдпрд╛ рд╣реИ, рдЖрдк odo рджреЗрдЦрдирд╛ рдЪрд╛рд╣реЗрдВрдЧреЗред рдПрдХ рдордзреНрдпрд╕реНрде рд╕реАрдПрд╕рд╡реА рдлрд╝рд╛рдЗрд▓ рдХрд╛ рдЙрдкрдпреЛрдЧ рд╣рдореЗрд╢рд╛ рдкрд░рд┐рдорд╛рдг рдХреЗ рдЖрджреЗрд╢ рддреЗрдЬреА рд╕реЗ рд╣реЛрдЧрд╛ рдЬреЛ рдХрд┐ sqlalchemy рдХреЗ рдорд╛рдзреНрдпрдо рд╕реЗ рдЬрд╛ рд░рд╣рд╛ рд╣реИ, рдЗрд╕рд╕реЗ рдХреЛрдИ рдлрд░реНрдХ рдирд╣реАрдВ рдкрдбрд╝рддрд╛ рдХрд┐ рдпрд╣рд╛рдВ рдХрд┐рд╕ рддрд░рд╣ рдХрд╛ рд╕реБрдзрд╛рд░ рд╣реЛрддрд╛ рд╣реИ ...

@ostrokach , рдореИрдВ рдЗрд╕ рдмрд╛рдд рд╕реЗ рд╕рд╣рдордд рдирд╣реАрдВ рд╣реВрдВ рдХрд┐ рдУрдбреЛ рдХрд╛ рд╡реНрдпрд╡рд╣рд╛рд░ рд╡рд╣реА рд╣реИ рдЬреЛ рд╕рд╛рдорд╛рдиреНрдп рдкрдВрдбреЛрдВ рдХрд╛ рдЙрдкрдпреЛрдЧрдХрд░реНрддрд╛ рдЪрд╛рд╣рддрд╛ рд╣реИред ODBC рдкрд░ рдмрд╣реБ-рдкрдВрдХреНрддрд┐ рд╕рдореНрдорд┐рд▓рди рд╕рдВрднрд╡рддрдГ рдЕрдзрд┐рдХрд╛рдВрд╢ рд╡рд┐рд╢реНрд▓реЗрд╖рдХреЛрдВ рдХреЗ рд▓рд┐рдП рдкрд░реНрдпрд╛рдкреНрдд рддреЗрдЬрд╝ рд╣реИрдВред

рдЕрдкрдиреЗ рд▓рд┐рдП рдмреЛрд▓рдиреЗ рдХреЗ рд▓рд┐рдП, рдореИрдВрдиреЗ рдКрдкрд░ рдХреЗ рдмрдВрджрд░ рдкреИрдЪ рд╕реЗ рдУрдбреЛ рдореЗрдВ рд╕реНрд╡рд┐рдЪ рдХрд░рдиреЗ рдореЗрдВ рдХреБрдЫ рдШрдВрдЯреЗ рдмрд┐рддрд╛рдПред рд╕рд╛рджрд╛ рдкрд╛рдВрдбрд╛ рд░рдирдЯрд╛рдЗрдо 10+ рдШрдВрдЯреЗ, рдЖрд░рдмреАрдПрдЖрд░ рдерд╛ред рдмрдВрджрд░ рдкреИрдЪ рдПрдХ рд╣реА рдбреЗрдЯрд╛ рд╕реЗрдЯ рдкрд░ 2 рдореЗрдВ рдЪрд▓рддрд╛ рд╣реИред
рдУрдбреЛ/рд╕реАрдПрд╕рд╡реА рдорд╛рд░реНрдЧ рдЕрдкреЗрдХреНрд╖рд╛ рдХреЗ рдЕрдиреБрд░реВрдк рддреЗрдЬрд╝ рдерд╛, рд▓реЗрдХрд┐рди рдЗрддрдирд╛ рдирд╣реАрдВ рдХрд┐ рдЗрд╕реЗ рдкреНрд░рдпрд╛рд╕ рдХреЗ рд▓рд╛рдпрдХ рдмрдирд╛рдпрд╛ рдЬрд╛ рд╕рдХреЗред рдореИрдВ рд╕реАрдПрд╕рд╡реА рд░реВрдкрд╛рдВрддрд░рдг рдХреЗ рдореБрджреНрджреЛрдВ рд╕реЗ рдЬреВрдЭ рд░рд╣рд╛ рдерд╛, рдЬрд┐рд╕рдХреА рдореБрдЭреЗ рдЬреНрдпрд╛рджрд╛ рдкрд░рд╡рд╛рд╣ рдирд╣реАрдВ рдереА, рд╕рднреА рдмрдВрджрд░ рдкреИрдЪ рд╕реЗ рдмрдЪрдиреЗ рдХреЗ рдирд╛рдо рдкрд░ред рдореИрдВ рдПрдирдПрд▓рдкреА рд╡рд┐рд╢реНрд▓реЗрд╖рдг рдХреЗ рд▓рд┐рдП рдкреЛрд╕реНрдЯрдЧреНрд░реЗрдЬ рдореЗрдВ рдПрдХ рд╕рд╛рдорд╛рдиреНрдп рдХреНрд╖реЗрддреНрд░ рдореЗрдВ ~ 10 mysql рдФрд░ PG DBs рд╕реЗ 250K рдкрдВрдХреНрддрд┐рдпреЛрдВ рдХрд╛ рдЖрдпрд╛рдд рдХрд░ рд░рд╣рд╛ рд╣реВрдВред

рдореИрдВ рдереЛрдХ рд▓реЛрдбрд┐рдВрдЧ рджреГрд╖реНрдЯрд┐рдХреЛрдг odo espouses рд╕реЗ рдЕрдЪреНрдЫреА рддрд░рд╣ рдкрд░рд┐рдЪрд┐рдд рд╣реВрдВред рдореИрдВрдиреЗ рдЙрдиреНрд╣реЗрдВ рд╡рд░реНрд╖реЛрдВ рд╕реЗ рдЙрдкрдпреЛрдЧ рдХрд┐рдпрд╛ рд╣реИ рдЬрд╣рд╛рдВ рдореИрдВ рд╕реАрдПрд╕рд╡реА рдбреЗрдЯрд╛ рд╕реЗ рд╢реБрд░реВ рдХрд░ рд░рд╣рд╛ рд╣реВрдВред рдЙрдирдХреА рдкреНрд░рдореБрдЦ рд╕реАрдорд╛рдПрдБ рд╣реИрдВ:

  1. df->CSV-> рдкреЛрд╕реНрдЯрдЧреНрд░реЗрдЬ рдХреЗрд╕ рдХреЗ рд▓рд┐рдП, PG рд╣реЛрд╕реНрдЯ рдкрд░ CSV рдкреНрд░рд╛рдкреНрдд рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рд╢реЗрд▓ рдПрдХреНрд╕реЗрд╕ рдФрд░ рдПрдХ scp рд╕реНрдЯреЗрдк рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реЛрддреА рд╣реИред рдРрд╕рд╛ рд▓рдЧрддрд╛ рд╣реИ рдХрд┐ @mangecoeur STDIN рдХреА рдПрдХ рдзрд╛рд░рд╛ рдХреЗ рд╕рд╛рде рдЗрд╕рдХреЗ рдЖрд╕рдкрд╛рд╕ рдкрд╣реБрдВрдЪ рдЧрдпрд╛ рд╣реИред
  2. рдореЗрд░реЗ рдЙрджреНрджреЗрд╢реНрдп рдХреЗ рд▓рд┐рдП (рдЯрд┐рдкреНрдкрдгрд┐рдпреЛрдВ рдХреА 250K рдкрдВрдХреНрддрд┐рдпрд╛рдБ, рдкрд╛рда рд╕рд╛рдордЧреНрд░реА рдореЗрдВ рдмрд╣реБрдд рд╕рд╛рд░реЗ рд╡рд┐рд╢реЗрд╖ рдорд╛рдорд▓реЛрдВ рдХреЗ рд╕рд╛рде) рдореИрдВрдиреЗ CSV рдорд╛рдкрджрдВрдбреЛрдВ рдХреЛ рд╕рд╣реА рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рд╕рдВрдШрд░реНрд╖ рдХрд┐рдпрд╛ред рдореИрдВ рдЗрд╕рдореЗрдВ рдирд┐рд╡реЗрд╢ рдЬрд╛рд░реА рд░рдЦрдиреЗ рдХреЗ рд▓рд┐рдП рдкреНрд░рджрд░реНрд╢рди рд▓рд╛рдн рдмреБрд░реА рддрд░рд╣ рд╕реЗ рдирд╣реАрдВ рдЪрд╛рд╣рддрд╛ рдерд╛ред

рдореИрдВ рдкреИрдЪ рдкрд░ рд╡рд╛рдкрд╕ рдЬрд╛рддрд╛ рд╣реВрдВ, рддрд╛рдХрд┐ рдореИрдВ рд╡рд┐рд╢реНрд▓реЗрд╖рдг рдХрд╛рд░реНрдп рдкрд░ рдЬрд╛ рд╕рдХреВрдВред

рдореИрдВ @jorisvandenbossche , @maxgrenderjones рд╕реЗ рд╕рд╣рдордд рд╣реВрдВред рдЗрд╕реЗ рдЪреБрдирдиреЗ рдХреЗ рд▓рд┐рдП рдПрдХ рд╡рд┐рдХрд▓реНрдк (рдбрд┐рдлрд╝реЙрд▓реНрдЯ рдирд╣реАрдВ) рдмреЗрд╣рдж рдЙрдкрдпреЛрдЧреА рд╣реЛрдЧрд╛ред @artemyk рдХреА рдмреЛрд▓реА рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рдмрд╛рддредsupports_multivalues_insert рдЗрд╕реЗ рдПрдХ рдЙрдЪрд┐рдд рдбрд┐рдлрд╝реЙрд▓реНрдЯ рднреА рдмрдирд╛ рд╕рдХрддрд╛ рд╣реИред

рдореБрдЭреЗ рдПрдХ рдкреАрдЖрд░ рд╕рдмрдорд┐рдЯ рдХрд░рдиреЗ рдореЗрдВ рдкреНрд░рд╕рдиреНрдирддрд╛ рд╣реЛ рд░рд╣реА рд╣реИ рдпрджрд┐ рдЗрд╕рд╕реЗ рдЗрд╕реЗ рдЖрдЧреЗ рдмрдврд╝рд╛рдпрд╛ рдЬрд╛ рд╕рдХреЗред

рдУрдбреЛ рдХреЗ рд╕рд╛рде рдЕрдкрдирд╛ рдЕрдиреБрднрд╡ рдЬреЛрдбрд╝рдиреЗ рдХреЗ рд▓рд┐рдП, рдПрдиреНрдХреЛрдбрд┐рдВрдЧ рдХреЗ рд╕рд╛рде рдЬреНрдЮрд╛рдд рд╕рдорд╕реНрдпрд╛ рдХреЗ рдХрд╛рд░рдг рдЗрд╕рдиреЗ рдПрдордПрд╕ рдПрд╕рдХреНрдпреВрдПрд▓ рдереЛрдХ рд╕рдореНрдорд┐рд▓рди рдХреЗ рд▓рд┐рдП рдХрд╛рдо рдирд╣реАрдВ рдХрд┐рдпрд╛ рд╣реИред рдЗрдореНрд╣реЛ рдПрдо-рд░реЛ рдЗрдВрд╕рд░реНрдЯ рдЕрдзрд┐рдХрд╛рдВрд╢ рдкреАрдкреАрдПрд▓ рдХреЗ рд▓рд┐рдП рдЕрдЪреНрдЫрд╛ рд╡реНрдпрд╛рд╡рд╣рд╛рд░рд┐рдХ рд╕рдорд╛рдзрд╛рди рд╣реИред

@markschwarz рдЗрд╕реЗ рддреЗрдЬреА рд╕реЗ рдХрд╛рдо рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рд╕рдХреНрд╖рдо рдХрд░рдиреЗ рдХрд╛ рдПрдХ рд╡рд┐рдХрд▓реНрдк рдмрд╣реБрдд рд╕реНрд╡рд╛рдЧрдд рдпреЛрдЧреНрдп рд╣реЛрдЧрд╛!

рдПрд╕рдХреНрд▓рд╛рдЗрдЯ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдХреЗ рдкреНрд░рд╢реНрдиреЛрдВ рдХреЛ рдЯреНрд░реЗрд╕ рдХрд░рдирд╛, рдореБрдЭреЗ рд▓рдЧрддрд╛ рд╣реИ рдХрд┐ chunksize рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рддреЗ рд╕рдордп рдмрд╣реБ-рдЖрд╡реЗрд╖рдг рдореЗрдВ рд╣реЛ рд░рд╣рд╛ рд╣реИ:

2017-09-28 00:21:39,007 INFO sqlalchemy.engine.base.Engine INSERT INTO country_hsproduct_year (location_id, product_id, year, export_rca, import_value, cog, export_value, distance, location_level, product_level) VALUES (?, ?, ?, ?, ?, ?, ?, ?, ?, ?)
2017-09-28 00:21:39,007 INFO sqlalchemy.engine.base.Engine ((75, 1237, 1996, 1.7283086776733398, 273487116.0, 0.0, 514320160.0, 0.5413745641708374, 'country', '4digit'), (75, 1237, 1997, 1.7167805433273315, 312047528.0, 0.0, 592372864.0, 0.5314807891845703, 'country', '4digit'), (75, 1237, 1998, 1.2120152711868286, 341676961.0, 0.0, 468860608.0, 0.5472233295440674, 'country', '4digit'), (75, 1237, 1999, 1.236651062965393, 334604240.0, 0.0, 440722336.0, 0.5695921182632446, 'country', '4digit'), (75, 1237, 2000, 1.189828872680664, 383555023.0, 0.0, 426384832.0, 0.5794379711151123, 'country', '4digit'), (75, 1237, 2001, 0.9920380115509033, 374157144.0, 0.3462945520877838, 327031392.0, 0.6234743595123291, 'country', '4digit'), (75, 1237, 2002, 1.0405025482177734, 471456583.0, 0.0, 377909376.0, 0.6023964285850525, 'country', '4digit'), (75, 1237, 2003, 1.147829532623291, 552441401.0, 0.0, 481313504.0, 0.5896202325820923, 'country', '4digit')  ... displaying 10 of 100000 total bound parameter sets ...  (79, 1024, 2015, 0.0, None, 0.8785018920898438, 0.0, 0.9823430776596069, 'country', '4digit'), (79, 1025, 1995, 0.0, None, 0.5624096989631653, 0.0, 0.9839603304862976, 'country', '4digit'))

(рдмрдВрджрд░ рдкреИрдЪ рдХреЗ рдмрд┐рдирд╛, рд╡рд╣ рд╣реИ)

рджрд┐рд▓рдЪрд╕реНрдк рдмрд╛рдд рдпрд╣ рд╣реИ рдХрд┐ рдмрдВрджрд░ рдкреИрдЪ рдХреЗ рд╕рд╛рде, рдпрд╣ рдЯреВрдЯ рдЬрд╛рддрд╛ рд╣реИ рдЬрдм рдореИрдВ рдЗрд╕реЗ 10 ^ 5 рдХрд╛ рд╣рд┐рд╕реНрд╕рд╛ рджреЗрддрд╛ рд╣реВрдВ, рд▓реЗрдХрд┐рди 10 ^ 3 рдирд╣реАрдВред рд╕реНрдХреНрд▓рд╛рдЗрдЯ рдкрд░ рддреНрд░реБрдЯрд┐ "рдмрд╣реБрдд рдЕрдзрд┐рдХ рдПрд╕рдХреНрдпреВрдПрд▓ рдЪрд░" рд╣реИред

@makmanalp , рдореИрдВрдиреЗ рдЙрд╕ рд╡реНрдпрд╡рд╣рд╛рд░ рдХреА рдЬрд╛рдВрдЪ рдХреЗ рд▓рд┐рдП рдкреАрдЬреА рдкрд░ рдкрддрд╛ рдирд╣реАрдВ рд▓рдЧрд╛рдпрд╛ рд╣реИ, рдлрд┐рд░ рднреА, рд▓реЗрдХрд┐рди рдореИрдВ рд▓рдЧрднрдЧ рд╣рдореЗрд╢рд╛ рд╕рдореНрдорд┐рд▓рд┐рдд рдХрд░рдиреЗ рдкрд░ рдЪрдВрдХреНрд╕рд╕рд╛рдЗрдЬ рд╕реЗрдЯ рдХрд░рддрд╛ рд╣реВрдВред рдЙрдкрд░реЛрдХреНрдд рдореЗрд░реЗ рдЙрджрд╛рд╣рд░рдг рдореЗрдВ, рдореИрдВрдиреЗ рдЗрд╕реЗ 200-5000 рдХреЗ рдмреАрдЪ рдпрд╛рджреГрдЪреНрдЫрд┐рдХ рд░реВрдк рд╕реЗ 5 рдорд╛рдиреЛрдВ рдкрд░ рд╕реЗрдЯ рдХрд┐рдпрд╛ рд╣реИред рдореИрдВрдиреЗ рдмрдВрджрд░ рдкреИрдЪ рдХреЗ рдмрд┐рдирд╛, рдЙрди рд╡рд┐рдХрд▓реНрдкреЛрдВ рдХреЗ рдмреАрдЪ рднрд╛рд░реА рдмреАрддрд╛ рд╣реБрдЖ рд╕рдордп рдЕрдВрддрд░ рдирд╣реАрдВ рджреЗрдЦрд╛ред рдкреИрдЪ рдХреЗ рд╕рд╛рде, рдмреАрддрд╛ рд╣реБрдЖ рд╕рдордп ~ 80% рдЧрд┐рд░ рдЧрдпрд╛ред

https://github.com/pandas-dev/pandas/issues/8953#issuecomment -76139975

рдХреНрдпрд╛ рдпрд╣ рдмрдВрджрд░ рдкреИрдЪ рдЕрднреА рднреА рдХрд╛рдо рдХрд░ рд░рд╣рд╛ рд╣реИ? рдореИрдВрдиреЗ рдЗрд╕реЗ MS SQL рд╕рд░реНрд╡рд░ рдкрд░ рдЖрдЬрд╝рдорд╛рдпрд╛ рд▓реЗрдХрд┐рди рдХреЛрдИ рд╕реБрдзрд╛рд░ рдирд╣реАрдВ рджреЗрдЦрд╛ред рдЗрд╕рдХреЗ рдЕрд▓рд╛рд╡рд╛, рдпрд╣ рдПрдХ рдЕрдкрд╡рд╛рдж рдлреЗрдВрдХрддрд╛ рд╣реИ:

(pyodbc.Error) ('07002', '[07002] [Microsoft][SQL Server Native Client 11.0]COUNT field incorrect or syntax error (0) (SQLExecDirectW)')

@hangyao рдореБрдЭреЗ рд▓рдЧрддрд╛ рд╣реИ рдХрд┐ рдкреИрдЪ рдХрд╛рд░реНрдпрд╛рдиреНрд╡рдпрди-рд╡рд┐рд╢рд┐рд╖реНрдЯ рд╣реИ, рдЙрди рдЪреАрдЬреЛрдВ рдореЗрдВ рд╕реЗ рдПрдХ рд╣реИ рдЬреЛ рдкрд╛рдЗрдерди рдбреАрдмреАрдПрдкреАрдЖрдИ рдбреАрдмреАрдПрдкреАрдЖрдИ рдбреНрд░рд╛рдЗрд╡рд░ рдХреЛ рд╕рдВрднрд╛рд▓рдиреЗ рдХреЗ рддрд░реАрдХреЗ рдкрд░ рдЫреЛрдбрд╝ рджреЗрддрд╛ рд╣реИред рддреЛ рдпрд╣ рддреЗрдЬ рд╣реЛ рд╕рдХрддрд╛ рд╣реИ рдпрд╛ рдирд╣реАрдВред рдЖрд░рдИ: рд╡рд╛рдХреНрдпрд╡рд┐рдиреНрдпрд╛рд╕ рддреНрд░реБрдЯрд┐, рдЗрд╕рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рдЕрдирд┐рд╢реНрдЪрд┐рддред

рдореИрдВ рдиреАрдЪреЗ рджрд┐рдП рдЧрдП рдлрд╝рдВрдХреНрд╢рди рдХреЛ /io/sql.py рдлрд╝рд╛рдЗрд▓ рдореЗрдВ рд▓рд╛рдЗрди 507 рдореЗрдВ рдЬреЛрдбрд╝рдиреЗ рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рд╕реЛрдЪ рд░рд╣рд╛ рд╣реВрдВ, _engine_builder рдлрд╝рдВрдХреНрд╢рди рдХреЗ рднреАрддрд░ рд▓рд╛рдЗрди 521 рдкрд░ рдПрдХ рдирдП IF рдХреНрд▓реЙрдЬ рдХреЗ рднреАрддрд░ 'рдирдпрд╛' _engine_builder рдиреАрдЪреЗ рдЯреБрдХрдбрд╝рд╛ред рдореИрдВрдиреЗ рдЗрд╕реЗ рдЕрдкрдиреЗ рдкрд░реНрдпрд╛рд╡рд░рдг рдкрд░ рд╕рдВрдХреНрд╖реЗрдк рдореЗрдВ рдкрд░реАрдХреНрд╖рдг рдХрд┐рдпрд╛ рд╣реИ рдФрд░ рдпрд╣ рдПрдордПрд╕рдПрд╕рдХреНрдпреВрдПрд▓ рдбреЗрдЯрд╛рдмреЗрд╕ рдХреЗ рд▓рд┐рдП рдмрд╣реБрдд рдЕрдЪреНрдЫрд╛ рдХрд╛рдо рдХрд░рддрд╛ рд╣реИ,> 100x рд╕реНрдкреАрдб-рдЕрдк рдкреНрд░рд╛рдкреНрдд рдХрд░рддрд╛ рд╣реИред рдореИрдВрдиреЗ рдЕрднреА рддрдХ рдЕрдиреНрдп рдбреЗрдЯрд╛рдмреЗрд╕ рдкрд░ рдЗрд╕рдХрд╛ рдкрд░реАрдХреНрд╖рдг рдирд╣реАрдВ рдХрд┐рдпрд╛ рд╣реИред

рдкреАрдЖрд░ рдмрдирд╛рдиреЗ рдХреЗ рд▓рд┐рдП рдореБрдЭреЗ рд╡рд╛рдкрд╕ рд▓реЗрдиреЗ рдХреА рдмрд╛рдд рдпрд╣ рд╣реИ рдХрд┐ рдореБрдЭреЗ рд▓рдЧрддрд╛ рд╣реИ рдХрд┐ рдЗрд╕реЗ рдиреАрдЪреЗ рдХреА рддрд░рд╣ рдбрд╛рд▓рдиреЗ рдХреА рддреБрд▓рдирд╛ рдореЗрдВ рдЗрд╕реЗ рд╕рд╛рдл рдФрд░ рд╕реБрд░рдХреНрд╖рд┐рдд рдмрдирд╛рдиреЗ рдХрд╛ рдЕрдзрд┐рдХ рдкреНрд░рдпрд╛рд╕ рд╣реИ, рдпрд╣ рд╣рдореЗрд╢рд╛ рд╡рд╛рдВрдЫрд┐рдд рдпреБрдХреНрддрд┐ рдирд╣реАрдВ рд╣реЛ рд╕рдХрддрд╛ рд╣реИ рдФрд░ рдПрдХ рдмреВрд▓рд┐рдпрди рд╕реНрд╡рд┐рдЪ рдЬреЛрдбрд╝ рд╕рдХрддрд╛ рд╣реИ, рдЬреЛ рдЗрд╕ рд╕реЗрдЯрд┐рдВрдЧ рдХреЛ рдЪрд╛рд▓реВ/рдмрдВрдж рдХрд░ рджреЗрддрд╛ рд╣реИ , (рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП fast_executemany=True ) to_sql рдореЗрдВ рдРрд╕рд╛ рд▓рдЧ рд░рд╣рд╛ рдерд╛ рдХрд┐ рдмрд┐рдирд╛ рдкреВрдЫреЗ рдмрд╕ рдХреБрдЫ рдХрд░рдирд╛ рдмрд╣реБрдд рдмрдбрд╝рд╛ рдкреНрд░рдпрд╛рд╕ рд╣реИ, рдореБрдЭреЗ рд▓рдЧрддрд╛ рд╣реИред

рддреЛ рдореЗрд░реЗ рдкреНрд░рд╢реНрди рд╣реИрдВ:

  • рдХреНрдпрд╛ рдиреАрдЪреЗ рджрд┐рдпрд╛ рдЧрдпрд╛ рдХрд╛рд░реНрдп рдХрд╛рдо рдХрд░рддрд╛ рд╣реИ рдФрд░ PostgreSQL рдХреЗ рд▓рд┐рдП INSERT рдЧрддрд┐ рднреА рдмрдврд╝рд╛рддрд╛ рд╣реИ?

  • рдХреНрдпрд╛ рдкрд╛рдВрдбрд╛ рдШрдЯрдирд╛ рдЗрд╕ рд╕реНрдирд┐рдкреЗрдЯ рдХреЛ рдЕрдкрдиреЗ рд╕реНрд░реЛрдд рдореЗрдВ рдЪрд╛рд╣рддреА рд╣реИ? рдпрджрд┐ рдРрд╕рд╛ рд╣реИ рддреЛ:

  • рдХреНрдпрд╛ рдЗрд╕ рдлрд╝рдВрдХреНрд╢рди рдХреЛ рдбрд┐рдлрд╝реЙрд▓реНрдЯ sql.py рдХрд╛рд░реНрдпрдХреНрд╖рдорддрд╛ рдореЗрдВ рдЬреЛрдбрд╝рдирд╛ рд╡рд╛рдВрдЫрд┐рдд рд╣реИ рдпрд╛ рдЗрд╕реЗ рдЬреЛрдбрд╝рдиреЗ рдХреЗ рд▓рд┐рдП рдХреЛрдИ рдмреЗрд╣рддрд░ рдЬрдЧрд╣ рд╣реИ?

рдХреБрдЫ рдЯрд┐рдкреНрдкрдгрд┐рдпрд╛рдБ рд╕реБрдирдирд╛ рдкрд╕рдВрдж рд╣реИред

рдЙрддреНрддрд░ рдХреЗ рд▓рд┐рдП рд╕реНрд░реЛрдд :

@event.listens_for(engine, 'before_cursor_execute')
def receive_before_cursor_execute(conn, cursor, statement, params, context, executemany):
    if executemany:
        cursor.fast_executemany = True
def _engine_builder(con):
    """
    Returns a SQLAlchemy engine from a URI (if con is a string)
    else it just return con without modifying it.
    """
    global _SQLALCHEMY_INSTALLED
    if isinstance(con, string_types):
        try:
            import sqlalchemy
        except ImportError:
            _SQLALCHEMY_INSTALLED = False
        else:
            con = sqlalchemy.create_engine(con)

    @event.listens_for(engine, 'before_cursor_execute')
    def receive_before_cursor_execute(conn, cursor, statement, params, context, executemany):
        if executemany:
            cursor.fast_executemany = True
return con

@ tsktsktsk123 рд╣рд╛рд▓ рд╣реА рдореЗрдВ рдЗрд╕рд╕реЗ рд╕рдВрдмрдВрдзрд┐рдд рдПрдХ рдкреАрдЖрд░ рдХрд╛ рд╡рд┐рд▓рдп рд╣реБрдЖ рд╣реИ: https://github.com/pandas-dev/pandas/pull/19664ред рдореИрдВрдиреЗ рдЕрднреА рддрдХ рдЖрдкрдХреА рдкреЛрд╕реНрдЯ рдХреЛ рд╡рд┐рд╕реНрддрд╛рд░ рд╕реЗ рдирд╣реАрдВ рджреЗрдЦрд╛ рд╣реИ, рдФрд░ рдпрд╣ рдирд┐рд╢реНрдЪрд┐рдд рд░реВрдк рд╕реЗ рдмрд┐рд▓реНрдХреБрд▓ рд╕рдорд╛рди рдирд╣реАрдВ рд╣реИ (рдпрд╣ sqlalchemy рдЗрдВрдЬрди рдХреА supports_multivalues_insert рд╡рд┐рд╢реЗрд╖рддрд╛ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рддрд╛ рд╣реИ), рд▓реЗрдХрд┐рди рдпрд╣ рд╕реБрдирд┐рд╢реНрдЪрд┐рдд рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдХрд┐ рдЖрдк рдЗрд╕рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рдЬрд╛рдирддреЗ рд╣реИрдВ рдпрджрд┐ рдпрд╣ рдкрд╣рд▓реЗ рд╕реЗ рд╣реА рдорджрдж рдХрд░рддрд╛ рд╣реИ рднреАред

рдпрд╣ рддреЛ рдмрд╣реБрдд рдЕрдЪреНрдЫреА рдЦрдмрд░ рд╣реИ! рдореИрдВрдиреЗ рдкреАрдЖрд░ рдореЗрдВ рдирд╣реАрдВ рджреЗрдЦрд╛ рд╣реИ, рд▓реЗрдХрд┐рди рдЗрд╕ рд╕рдкреНрддрд╛рд╣ рдХреЗ рдЕрдВрдд рдореЗрдВ рдЗрд╕рдХреА рддреБрд▓рдирд╛ рдХрд░реВрдВрдЧрд╛ рдФрд░ рдкрд░рд┐рдгрд╛рдореЛрдВ рдХреЗ рд╕рд╛рде рд╡рд╛рдкрд╕ рдЖрдКрдВрдЧрд╛ред рд╕рд░ рдЙрдард╛рдиреЗ рдХреЗ рд▓рд┐рдП рдзрдиреНрдпрд╡рд╛рджред

рдореИрдВ рд╕рд┐рд░реНрдл 0.23.0 рдЖрд░рд╕реА 2 (рдкреЛрд╕реНрдЯрдЧреНрд░реЗрд╕реНрдХреНрд▓ рдкрд░) рдХреА рдХреЛрд╢рд┐рд╢ рдХрд░ рд░рд╣рд╛ рдерд╛ рдФрд░ рдкреНрд░рджрд░реНрд╢рди рдХреЛ рдмрдврд╝рд╛рд╡рд╛ рджреЗрдиреЗ рдХреЗ рдмрдЬрд╛рдп рдореЗрд░реА рд╕реНрдХреНрд░рд┐рдкреНрдЯ рдХреЛ рдХрд╛рдлреА рдзреАрдореА рдЧрддрд┐ рдорд┐рд▓реАред рдбреАрдмреА рдХреНрд╡реЗрд░реА рдмрд╣реБрдд рддреЗрдЬ рд╣реЛ рдЧрдИ рд▓реЗрдХрд┐рди to_sql() рдХреЗ рд▓рд┐рдП рд╕рдордп рдорд╛рдкрдиреЗ рд╕реЗ рдпрд╣ рд╡рд╛рд╕реНрддрд╡ рдореЗрдВ 1.5 рдЧреБрдирд╛ рдзреАрдореА рд╣реЛ рдЧрдИ (рдЬреИрд╕реЗ 7 рд╕реЗ 11 рд╕реЗрдХреЗрдВрдб рддрдХ) ...

рд╕реБрдирд┐рд╢реНрдЪрд┐рдд рдирд╣реАрдВ рд╣реИ рдХрд┐ рдЗрд╕ рдкреАрдЖрд░ рд╕реЗ рдзреАрдорд╛рдкрди рдЖрддрд╛ рд╣реИ, рд╣рд╛рд▓рд╛рдВрдХрд┐ рдореИрдВрдиреЗ рдЕрднреА рдЖрд░рд╕реА рдХрд╛ рдкрд░реАрдХреНрд╖рдг рдХрд┐рдпрд╛ рд╣реИред

рдХрд┐рд╕реА рдФрд░ рдиреЗ рднреА рдЗрд╕реА рд╕рдорд╕реНрдпрд╛ рдХрд╛ рдЕрдиреБрднрд╡ рдХрд┐рдпрд╛ рд╣реИ?

@ schettino72 рдЖрдк рдХрд┐рддрдирд╛ рдбреЗрдЯрд╛ рдбрд╛рд▓ рд░рд╣реЗ рдереЗ?

10 рдХреЙрд▓рдо рд╡рд╛рд▓реА рд▓рдЧрднрдЧ 30K рдкрдВрдХреНрддрд┐рдпрд╛рдБред рд▓реЗрдХрд┐рди рд╡рд╛рд╕реНрддрд╡ рдореЗрдВ рдореИрдВ рдЬреЛ рдХреБрдЫ рднреА рдХреЛрд╢рд┐рд╢ рдХрд░рддрд╛ рд╣реВрдВ рд╡рд╣ рдзреАрдорд╛ рд╣реИ (рдПрд╕рдХреНрдпреВрдПрд▓ рддреЗрдЬ рд╣реИ рд▓реЗрдХрд┐рди рдХреБрд▓ рдорд┐рд▓рд╛рдХрд░ рдзреАрдорд╛ рд╣реИ)ред рдпрд╣ рдПрдХ рд╡рд┐рд╢рд╛рд▓ SQL рдХрдерди рдмрдирд╛ рд░рд╣рд╛ рд╣реИ рдЬрд╣рд╛рдБ рд╣рд░ рдореВрд▓реНрдп рдХреЗ рд▓рд┐рдП рдореВрд▓реНрдп рдкреНрд░рдХреНрд╖реЗрдк рд╣реИред рдХреБрдЫ рдЗрд╕ рддрд░рд╣

 %(user_id_m32639)s, %(event_id_m32639)s, %(colx_m32639)s,

рдореБрдЭреЗ d6tstack рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдирд╛ рдмрд╣реБрдд рдЖрд╕рд╛рди рд▓рдЧрд╛, рдпрд╣ рдПрдХ-рд▓рд╛рдЗрдирд░ d6tstack.utils.pd_to_psql(df, cfg_uri_psql, 'benchmark', if_exists='replace') рд╣реИ рдФрд░ рдпрд╣ df.to_sql() рд╕реЗ рдмрд╣реБрдд рддреЗрдЬрд╝ рд╣реИред рдкреЛрд╕реНрдЯрдЧреНрд░реЗрдЬ рдФрд░ MySQL рдХрд╛ рд╕рдорд░реНрдерди рдХрд░рддрд╛ рд╣реИред рджреЗрдЦреЗрдВ https://github.com/d6t/d6tstack/blob/master/examples-sql.ipynb

рдореИрдВ рдмрдВрджрд░ рдкреИрдЪ рд╕рдорд╛рдзрд╛рди рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░ рд░рд╣рд╛ рд╣реВрдВ:

from pandas.io.sql import SQLTable

def _execute_insert(self, conn, keys, data_iter):
    print "Using monkey-patched _execute_insert"
    data = [dict((k, v) for k, v in zip(keys, row)) for row in data_iter]
    conn.execute(self.insert_statement().values(data))

SQLTable._execute_insert = _execute_insert

рдХреБрдЫ рд╕рдордп рдХреЗ рд▓рд┐рдП, рд▓реЗрдХрд┐рди рдЕрдм рдореБрдЭреЗ рдПрдХ рддреНрд░реБрдЯрд┐ рдорд┐рд▓ рд░рд╣реА рд╣реИ:

TypeError: insert_statement() missing 2 required positional arguments: 'data' and 'conn'

рдХреНрдпрд╛ рдХрд┐рд╕реА рдФрд░ рдХреЛ рдпрд╣ рдорд┐рд▓ рд░рд╣рд╛ рд╣реИ? рдореИрдВ рдЕрдЬрдЧрд░ 3.6.5 (рдПрдирд╛рдХреЛрдВрдбрд╛) рдФрд░ рдкрд╛рдВрдбрд╛ рдкрд░ рд╣реВрдБ==0.23.0

рдХреНрдпрд╛ рдпрд╣ рдареАрдХ рд╣реЛ рд░рд╣рд╛ рд╣реИ? рд╡рд░реНрддрдорд╛рди рдореЗрдВ, df.to_sql рдмреЗрд╣рдж рдзреАрдорд╛ рд╣реИ рдФрд░ рдХрдИ рд╡реНрдпрд╛рд╡рд╣рд╛рд░рд┐рдХ рдЙрдкрдпреЛрдЧ рдХреЗ рдорд╛рдорд▓реЛрдВ рдХреЗ рд▓рд┐рдП рдЗрд╕рдХрд╛ рдмрд┐рд▓реНрдХреБрд▓ рднреА рдЙрдкрдпреЛрдЧ рдирд╣реАрдВ рдХрд┐рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИред рдРрд╕рд╛ рд▓рдЧрддрд╛ рд╣реИ рдХрд┐ рдУрдбреЛ рдкрд░рд┐рдпреЛрдЬрдирд╛ рдкрд╣рд▓реЗ рд╣реА рдЫреЛрдбрд╝ рджреА рдЧрдИ рд╣реИред
рдореЗрд░реЗ рдкрд╛рд╕ рд╡рд┐рддреНрддреАрдп рд╕рдордп рд╢реНрд░реГрдВрдЦрд▓рд╛ рдореЗрдВ рдирд┐рдореНрдирд▓рд┐рдЦрд┐рдд рдЙрдкрдпреЛрдЧ рдХреЗ рдорд╛рдорд▓реЗ рд╣реИрдВ рдЬрд╣рд╛рдВ df.to_sql рдмрд╣реБрдд рдЕрдзрд┐рдХ рдкреНрд░рдпреЛрдЧ рдХрд░рдиреЗ рдпреЛрдЧреНрдп рдирд╣реАрдВ рд╣реИ:
1) рдбреЗрдЯрд╛рдмреЗрд╕ рдХреЛ рдкреЛрд╕реНрдЯрдЧреНрд░реЗрдЬ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдРрддрд┐рд╣рд╛рд╕рд┐рдХ рд╕реАрдПрд╕рд╡реА рдбреЗрдЯрд╛ рдХреА рдкреНрд░рддрд┐рд▓рд┐рдкрд┐ рдмрдирд╛рдирд╛ - df.to_sql рдХрд╛ рдЙрдкрдпреЛрдЧ рдирд╣реАрдВ рдХрд░ рд╕рдХрддрд╛ рдФрд░ psycopg2 copy_from рдХрд╛рд░реНрдпрдХреНрд╖рдорддрд╛ рдХреЗ рдЖрд╕рдкрд╛рд╕ рдХрд╕реНрдЯрдо рдХреЛрдб рдХреЗ рд╕рд╛рде рдЬрд╛рдирд╛ рдкрдбрд╝рд╛
2) рд╕реНрдЯреНрд░реАрдорд┐рдВрдЧ рдбреЗрдЯрд╛ (~ 500-3000 рдкрдВрдХреНрддрд┐рдпреЛрдВ рдХреЗ рдПрдХ рдмреИрдЪ рдореЗрдВ рдкреНрд░рддрд┐ рд╕реЗрдХрдВрдб) рдХреЛ рдкреЛрд╕реНрдЯрдЧреНрд░реЗрдЬ рдбреЗрдЯрд╛рдмреЗрд╕ рдореЗрдВ рдбрдВрдк рдХрд┐рдпрд╛ рдЬрд╛рдирд╛ рд╣реИ - рдлрд┐рд░ рд╕реЗ df.to_sql рдкреНрд░рджрд░реНрд╢рди рдмрд╣реБрдд рдирд┐рд░рд╛рд╢рд╛рдЬрдирдХ рд╣реИ рдХреНрдпреЛрдВрдХрд┐ рдбреЗрдЯрд╛ рдХреЗ рдЗрди рдкреНрд░рд╛рдХреГрддрд┐рдХ рдмреИрдЪреЛрдВ рдХреЛ рдкреЛрд╕реНрдЯрдЧреНрд░реЗрдЬ рдореЗрдВ рд╕рдореНрдорд┐рд▓рд┐рдд рдХрд░рдиреЗ рдореЗрдВ рдмрд╣реБрдд рдЕрдзрд┐рдХ рд╕рдордп рд▓рдЧ рд░рд╣рд╛ рд╣реИред
рдПрдХрдорд╛рддреНрд░ рдЬрдЧрд╣ рдЬрд╣рд╛рдВ рдореБрдЭреЗ df.to_sql рдЙрдкрдпреЛрдЧреА рд▓рдЧрддрд╛ рд╣реИ, рд╡рд╣ рд╣реИ рд╕реНрд╡рдЪрд╛рд▓рд┐рдд рд░реВрдк рд╕реЗ рдЯреЗрдмрд▓ рдмрдирд╛рдирд╛ !!! - рдЬреЛ рдЙрд╕ рдЙрдкрдпреЛрдЧ рдХреЗ рдорд╛рдорд▓реЗ рдореЗрдВ рдирд╣реАрдВ рд╣реИ рдЬрд┐рд╕рдХреЗ рд▓рд┐рдП рдЗрд╕реЗ рдбрд┐рдЬрд╛рдЗрди рдХрд┐рдпрд╛ рдЧрдпрд╛ рдерд╛ред
рдореБрдЭреЗ рдпрдХреАрди рдирд╣реАрдВ рд╣реИ рдХрд┐ рдЕрдиреНрдп рд▓реЛрдЧ рднреА рд╕рдорд╛рди рдЪрд┐рдВрддрд╛ рд╕рд╛рдЭрд╛ рдХрд░рддреЗ рд╣реИрдВ, рд▓реЗрдХрд┐рди рдЗрд╕ рдореБрджреНрджреЗ рдХреЛ рд╕реБрдЪрд╛рд░реВ рд░реВрдк рд╕реЗ рдХрд╛рдо рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП "рдбреЗрдЯрд╛рдлреНрд░реЗрдо-рдЯреВ-рдбреЗрдЯрд╛рдмреЗрд╕" рдЗрдВрдЯрд░рдлреЗрд╕ рдХреЗ рд▓рд┐рдП рдХреБрдЫ рдзреНрдпрд╛рди рджреЗрдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИред
рдЖрд╢рд╛ рдХрд░рдирд╛ред

рдЕрд░реЗ, рдЬрдм рдореИрдВ SQLite рдбреЗрдЯрд╛рдмреЗрд╕ рдореЗрдВ рдмрд╣реБ-рд╕рдореНрдорд┐рд▓рд┐рдд рдХрд░рдиреЗ рдХрд╛ рдкреНрд░рдпрд╛рд╕ рдХрд░рддрд╛ рд╣реВрдВ рддреЛ рдореБрдЭреЗ рдпрд╣ рддреНрд░реБрдЯрд┐ рдорд┐рд▓ рд░рд╣реА рд╣реИ:

рдпрд╣ рдореЗрд░рд╛ рдХреЛрдб рд╣реИ:
df.to_sql("financial_data", con=conn, if_exists="append", index=False, method="multi")

рдФрд░ рдореБрдЭреЗ рдпрд╣ рддреНрд░реБрдЯрд┐ рдорд┐рд▓рддреА рд╣реИ:

Traceback (most recent call last):

  File "<ipython-input-11-cf095145b980>", line 1, in <module>
    handler.insert_financial_data_from_df(data, "GOOG")

  File "C:\Users\user01\Documents\Code\FinancialHandler.py", line 110, in insert_financial_data_from_df
    df.to_sql("financial_data", con=conn, if_exists="append", index=False, method="multi")

  File "C:\Users\user01\AppData\Local\Continuum\anaconda3\lib\site-packages\pandas\core\generic.py", line 2531, in to_sql
    dtype=dtype, method=method)

  File "C:\Users\user01\AppData\Local\Continuum\anaconda3\lib\site-packages\pandas\io\sql.py", line 460, in to_sql
    chunksize=chunksize, dtype=dtype, method=method)

  File "C:\Users\user01\AppData\Local\Continuum\anaconda3\lib\site-packages\pandas\io\sql.py", line 1547, in to_sql
    table.insert(chunksize, method)

  File "C:\Users\user01\AppData\Local\Continuum\anaconda3\lib\site-packages\pandas\io\sql.py", line 686, in insert
    exec_insert(conn, keys, chunk_iter)

  File "C:\Users\user01\AppData\Local\Continuum\anaconda3\lib\site-packages\pandas\io\sql.py", line 609, in _execute_insert_multi
    conn.execute(self.table.insert(data))

TypeError: insert() takes exactly 2 arguments (1 given)

рдРрд╕рд╛ рдХреНрдпреЛрдВ рд╣реЛ рд░рд╣рд╛ рд╣реИ? рдореИрдВ рдкрд╛рдпрдерди 3.7.3 (рдПрдирд╛рдХреЛрдВрдбрд╛), рдкрд╛рдВрдбрд╛ 0.24.2 рдФрд░ sqlite3 2.6.0 рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░ рд░рд╣рд╛ рд╣реВрдВред

рдЕрдЧреНрд░рд┐рдо рдмрд╣реБрдд рдмрд╣реБрдд рдзрдиреНрдпрд╡рд╛рдж!

@jconstanzo рдХреНрдпрд╛ рдЖрдк рдЗрд╕реЗ рдПрдХ рдирдП рдореБрджреНрджреЗ рдХреЗ рд░реВрдк рдореЗрдВ рдЦреЛрд▓ рд╕рдХрддреЗ рд╣реИрдВ?
рдФрд░ рдпрджрд┐ рд╕рдВрднрд╡ рд╣реЛ, рддреЛ рдХреНрдпрд╛ рдЖрдк рдПрдХ рдкреНрд░рддрд┐рд▓рд┐рдкрд┐ рдкреНрд░рд╕реНрддреБрдд рдХрд░рдиреЗ рдпреЛрдЧреНрдп рдЙрджрд╛рд╣рд░рдг рдкреНрд░рджрд╛рди рдХрд░рдиреЗ рдХрд╛ рдкреНрд░рдпрд╛рд╕ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ? (рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП рдПрдХ рдЫреЛрдЯрд╛ рд╕рд╛ рдЙрджрд╛рд╣рд░рдг рдбреЗрдЯрд╛рдлреНрд░реЗрдо рдЬреЛ рд╕рдорд╕реНрдпрд╛ рджрд┐рдЦрд╛ рд╕рдХрддрд╛ рд╣реИ)

@jconstanzo рдпрд╣рд╛рдБ рдПрдХ рд╣реА рд╕рдорд╕реНрдпрд╛ рд╣реИред рдЬрдм рдЖрдк SQLite рдбреЗрдЯрд╛рдмреЗрд╕ рдореЗрдВ рдбрд╛рд▓рдиреЗ рдХрд╛ рдкреНрд░рдпрд╛рд╕ рдХрд░рддреЗ рд╣реИрдВ рддреЛ method='multi' (рдореЗрд░реЗ рдорд╛рдорд▓реЗ рдореЗрдВ, chunksize рдХреЗ рд╕рдВрдпреЛрдЬрди рдореЗрдВ) рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдирд╛ рдЗрд╕ рддреНрд░реБрдЯрд┐ рдХреЛ рдЯреНрд░рд┐рдЧрд░ рдХрд░рдиреЗ рд▓рдЧрддрд╛ рд╣реИред

рджреБрд░реНрднрд╛рдЧреНрдп рд╕реЗ рдореИрдВ рд╡рд╛рд╕реНрддрд╡ рдореЗрдВ рдПрдХ рдЙрджрд╛рд╣рд░рдг рдбреЗрдЯрд╛рдлреНрд░реЗрдо рдкреНрд░рджрд╛рди рдирд╣реАрдВ рдХрд░ рд╕рдХрддрд╛ рдХреНрдпреЛрдВрдХрд┐ рдореЗрд░рд╛ рдбреЗрдЯрд╛рд╕реЗрдЯ рдмрд╣реБрдд рдмрдбрд╝рд╛ рд╣реИ, рдпрд╣реА рдХрд╛рд░рдг рд╣реИ рдХрд┐ рдореИрдВ рдкрд╣рд▓реЗ рд╕реНрдерд╛рди рдкрд░ method рдФрд░ chunksize рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░ рд░рд╣рд╛ рд╣реВрдВред

рджреЗрд░реА рдХреЗ рд▓рд┐рдП рдорд╛рдлреА рдЪрд╛рд╣рддрд╛ рд╣реВрдВред рдореИрдВрдиреЗ рдЕрднреА рдЗрд╕ рд╕рдорд╕реНрдпрд╛ рдХреЗ рд▓рд┐рдП рдПрдХ рдореБрджреНрджрд╛ рдЦреЛрд▓рд╛ рд╣реИ: https://github.com/pandas-dev/pandas/issues/29921

рдХреНрдпрд╛ рдпрд╣ рдкреГрд╖реНрда рдЙрдкрдпреЛрдЧреА рдерд╛?
0 / 5 - 0 рд░реЗрдЯрд┐рдВрдЧреНрд╕

рд╕рдВрдмрдВрдзрд┐рдд рдореБрджреНрджреЛрдВ

matthiasroder picture matthiasroder  ┬╖  3рдЯрд┐рдкреНрдкрдгрд┐рдпрд╛рдБ

hiiwave picture hiiwave  ┬╖  3рдЯрд┐рдкреНрдкрдгрд┐рдпрд╛рдБ

ebran picture ebran  ┬╖  3рдЯрд┐рдкреНрдкрдгрд┐рдпрд╛рдБ

nathanielatom picture nathanielatom  ┬╖  3рдЯрд┐рдкреНрдкрдгрд┐рдпрд╛рдБ

mfmain picture mfmain  ┬╖  3рдЯрд┐рдкреНрдкрдгрд┐рдпрд╛рдБ