df.to_sql('TableNameHere', engine, if_exists='append', chunksize=900, index=False)
SQL ν
μ΄λΈμ ν° DataFrameμ μΆκ°νλ €κ³ ν©λλ€. DataFrameμ μΌλΆ νμ SQL ν
μ΄λΈμ νκ³Ό μ€λ³΅λκ³ μΌλΆλ κ·Έλ μ§ μμ΅λλ€. κ·Έλ¬λ to_sql()
λ μ€λ³΅μ΄ νλλΌλ κ°μ§λλ©΄ μ€νμ μμ ν μ€μ§ν©λλ€.
to_sql(if_exists='append')
κ° μ¬μ©μμκ² μ€λ³΅ ν€κ° μλ νμ κ²½κ³ νκ³ μ€νμ μμ ν μ€μ§νμ§ μκ³ κ³μν΄μ μ νμ μΆκ°νλ κ²μ΄ ν©λ¦¬μ μ
λλ€. ν° λ°μ΄ν° μΈνΈμ κ²½μ° μ€λ³΅μ΄ μμ μ μμ§λ§ 무μνκ³ μΆμ κ²μ
λλ€.
μ€λ³΅μ 무μνκ³ κ³μ μ€ννλ μΈμλ₯Ό μΆκ°ν μ μμ΅λκΉ? 'append_skipdupes'
μ κ°μ μΆκ° if_exists
μ΅μ
μ΄ μμ΅λκΉ?
pd.show_versions()
μ μΆλ ₯컀λ°: μμ
νμ΄μ¬: 3.6.0.final.0
νμ΄μ¬ λΉνΈ: 64
μ΄μ 체μ : μλμ°
OS 릴리μ€: 10
κΈ°κ³: AMD64
νλ‘μΈμ: Intel64 μ νκ΅° 6 λͺ¨λΈ 60 μ€ν
ν 3, μ ν μΈν
λ°μ΄νΈ μ€λ: μ‘°κΈ
LC_ALL: μμ
λ: μμ
LOCALE: English_United States.1252
ν¬λ: 0.19.2
μ½: μμ
ν: 9.0.1
μ€μ λꡬ: 28.8.0
μ¬μ΄μ¬: μμ
μ«μ: 1.12.0
scipy: μμ
ν΅κ³ λͺ¨λΈ: μμ
xarray: μμ
μμ΄νμ΄μ¬: 5.3.0
μ€νν¬μ€: μμ
ν¨ν°: μμ
λ μ§ μ νΈλ¦¬ν°: 2.6.0
νΌμΈ : 2016.10
λΈλ‘: μμ
λ³λͺ© νμ: μμ
ν
μ΄λΈ: μμ
numexpr: μμ
matplotlib: μμ
openpyxl: μμ
xlrd: μμ
xlwt: μμ
xlsxwriter: μμ
lxml: μμ
bs4: μμ
html5lib: 0.999999999
httplib2: μμ
API ν΄λΌμ΄μΈνΈ: μμ
sqlalchemy: 1.1.9
pymysql: μμ
psycopg2: μμ
μ§μ2: 2.9.5
보ν : μμ
pandas_datareader: μμ
μ΄κ²μ λν "μ€λ³΅ μ λ°μ΄νΈ" λͺ¨λλ μ§μν΄μΌ ν©λλ€.
@rosstripi μ΄ μμ΄λμ΄λ νμ€ν λ°μλ€μ¬μ§ κ²μ΄λΌκ³ μκ°νμ§λ§ AFAIKμ μ£Όμ λ³λͺ© νμμ sql/sqlalchemyλ₯Ό νλ―Έμ ꡬμ λ°μ§ μλ λ°©μμΌλ‘ μ¬μ©νμ¬ κ΅¬ννλ κ²μ λλ€. μ΄ μμ μ μνν μ μλ λ°©λ²μ λν μΌλΆ νμμ νμ€ν νμν©λλ€!
μλ νμΈμ μ΄μ λν ν΄κ²° λ°©λ²μ μμλμ΅λκΉ? μλ €μ£ΌμΈμ
μ΄ κ΅¬νμ λν μ λ°μ΄νΈκ° μμ΅λκΉ?
μ λ μ΄μ PostgreSQL λ° SQLAlchemyμμ μ΄ λ¬Έμ μ μ§λ©΄ν΄ μμΌλ©° "μ€λ³΅ μ λ°μ΄νΈ μ"λ₯Ό μν©λλ€.
μμ μ κ°μ¬λ립λλ€
ν΄κ²° λ°©λ²μ λ°μ΄ν°λ² μ΄μ€μμ κ³ μ μΈλ±μ€λ₯Ό μ κ±°νλ κ²μ λλ€.
sqlquery="ALTER 'TABLE DATABASE'.'TABLE' DROP INDEX 'idx_name'"
λμ€μ
df.to_sql('TableNameHere', engine, if_exists='append', chunksize=900, index=False)
μ€νν μ μμ΅λλ€.
MySQL μλ²κ° μΈλ±μ€λ₯Ό λ€μ μΆκ°νκ³ μ€λ³΅μ μμ νλλ‘ νμμμ€.
sqlquery="ALTER IGNORE TABLE 'DATABASE'.'TABLE' ADD UNIQUE INDEX 'idx_name' ('column_name1' ASC, 'column_name2' ASC, 'column_name3' '[ASC | DESC]')"
νΉμ μμ© νλ‘κ·Έλ¨μ λ°λΌ λμμ΄ λ μ μμ΅λλ€.
μ΄μ¨λ $# append_skipdupes
if_exists
μ΅μ
μ΄ ν¨μ¬ λ μ’μ΅λλ€.
append_skipdupes
λ μ΄κ²μ μ²λ¦¬νλ μλ²½ν λ°©λ²μ
λλ€.
μ, append_skipdupes +1
df.to_sql()
μ μ΅μ
μ μ¬μ©νμ¬ μ΄ λ¬Έμ λ₯Ό ν΄κ²°ν μ μλ€λ λ° λμνμ΅λλ€.
λ€μμ sqliteμμ μ¬μ©νλ ν΄κ²° λ°©λ²μ λλ€.
CREATE TABLE IF NOT EXISTS my_table_name (
some_kind_of_id INT PRIMARY KEY ON CONFLICT IGNORE,
...
κ·Έλ° λ€μ μ€λ³΅ νλͺ©μ μ½μ νλ©΄ μλμΌλ‘ 무μλκ³ μ€λ³΅λμ§ μμ νλͺ©μ΄ μ¬λ°λ₯΄κ² μ²λ¦¬λ©λλ€. μ κ²½μ°μλ λ°μ΄ν°κ° μ μ μ΄μ΄μΌ νλ―λ‘ μ λ°μ΄νΈν νμκ° μμ΅λλ€. λ°μ΄ν° νΌλμ νμμ΄ λ¬΄μν μ μλ μ€λ³΅μ μ»μ μ μλ€λ κ²λΏμ λλ€.
MariaDb λ° MySqlμ λ€λ₯Έ ν΄κ²° λ°©λ²:
df.to_csv("test.csv")
λ€μμ μ¬μ©νμμμ€.
LOAD DATA INFILE 'test.csv' IGNORE INTO TABLE mytable
λλ
LOAD DATA INFILE 'test.csv' REPLACE INTO TABLE mytable
.
LOAD DATAλ INSERTλ³΄λ€ λ§€μ° λΉ λ¦ λλ€.
μμ ν μ½λ:
csv_path = str(Path(application_path) / "tmp" / "tmp.csv").replace("\\", "\\\\")
df.to_csv(csv_path, index=False, sep='\t', quotechar="'", na_rep=r'\N')
rq = """LOAD DATA LOCAL INFILE '{file_path}' REPLACE INTO TABLE {db}.{db_table}
LINES TERMINATED BY '\\r\\n'
IGNORE 1 LINES
({col});
""".format(db=db,
file_path=csv_path,
db_table=table_name,
col=",".join(df.columns.tolist()))
λλ μ΄κ²μ΄ #14553μ μ£Όμλ‘ νλ upsert_ignore
μΈμλ‘ #29636μμ ν΄κ²°λκ³ μλ€κ³ λ―Ώμ΅λλ€.
append_skipdupes +1
append_skipdupesμ κ²½μ° +1
'append_skipdupes'λ₯Ό μΆκ°ν΄μΌ ν©λλ€.
μ, λΆνν©λλ€. κΈ°λ³Έ ν€ μ΄λΏλ§ μλλΌ 'append_skipdupes'λ₯Ό μΆκ°ν΄μΌ ν©λλ€. λ€λ₯Έ κ³ μ μ΄ κ°μ μ€λ³΅μ΄ μλ κ²½μ° μ μ€λ³΅ ν μΆκ°λ₯Ό 건λλ°μ΄μΌ ν©λλ€.
append_skipdupesμ κ²½μ° +1
append_skipdupes +1
append_skipdupes +1
append_skipdupesμ κ²½μ° +1
κ·Έλμ https://pypi.org/project/pangres/ λ₯Ό μ¬μ©ν μ μμ΅λλ€.
κ°μ₯ μ μ©ν λκΈ
μ΄κ²μ λν "μ€λ³΅ μ λ°μ΄νΈ" λͺ¨λλ μ§μν΄μΌ ν©λλ€.