반응형
python mysqldb를 사용하여 한 번에 많은 행을 삽입하는 방법
예를 들어 목록을 가지고 있습니다.[['a','b'],['c','d']]
.
라는 테이블이 있습니다.T
두개의 필드F1
,F2
. 필드 목록의 첫 번째 항목은 다음으로 매핑됩니다.F1
, 에 뒤지지 않는F2
.
이와 같이 for 루프를 사용하지 않고 단일 명령이나 호출에서 각 내부 목록의 행을 삽입하려면 어떻게 해야 합니까?
for i in [['a','b'],['c','d']]:
c.execute("insert into T (F1,F2) values (%s, %s)", (i[0], i[1]))
c.executemany(
"""INSERT INTO breakfast (name, spam, eggs, sausage, price)
VALUES (%s, %s, %s, %s, %s)""",
[
("Spam and Sausage Lover's Plate", 5, 1, 8, 7.95 ),
("Not So Much Spam Plate", 3, 2, 0, 3.95 ),
("Don't Wany ANY SPAM! Plate", 0, 4, 3, 5.95 )
] )
그래서 당신의 경우:
c.executemany("insert into T (F1,F2) values (%s, %s)",
[('a','b'),('c','d')])
@adamhajari와 같은 하나의 문장에 모든 행을 삽입하고 @zenpoy와 같은 sql 주입을 동시에 피할 수 있습니다.그냥 큰 삽입문을 만들어서 내 sqldb의 것을 허용하면 됩니다.execute
포맷을 합니다.
values_to_insert = [('a','b'),('c','d')]
query = "INSERT INTO T (F1, F2) VALUES " + ",".join("(%s, %s)" for _ in values_to_insert)
flattened_values = [item for sublist in values_to_insert for item in sublist]
c.execute(query, flattened_values)
판독성이 뛰어나지는 않지만 실행 파일 수보다 약간 더 빠를 수 있습니다(로컬 DB에 50000개 행의 배치를 삽입해 보았는데 실행 파일 수가 20% 느렸습니다).
def multiple_insert(cursor, table, cols, rows):
sql_insert = 'INSERT INTO %s(%s) values %s' % (
table,
','.join(cols),
','.join('(%s , %s)' for _ in rows)
)
values = [_ for r in rows for _ in r]
cursor.execute(sql_insert, values)
# eg:
rows = [(a1 , b1),(a2 , b2),(a3 , b3)]
multiple_insert(cursor, 'your_table',('col1', 'col2'), rows)
conn.commit()
언급URL : https://stackoverflow.com/questions/14011160/how-to-use-python-mysqldb-to-insert-many-rows-at-once
반응형
'programing' 카테고리의 다른 글
INSTALL_FAILED_DEXOPT 오류를 해결하려면 어떻게 해야 합니까? (0) | 2023.10.18 |
---|---|
AngularJS를 클립보드로 복사 (0) | 2023.10.18 |
프리오픈 후 출력을 다시 화면으로 리디렉션하는 방법("out.txt", "a", stdout) (0) | 2023.10.13 |
JQuery Accordion 자동 높이 문제 (0) | 2023.10.13 |
빈에 다양한 생성자가 있을 때 생성자 주입을 위해 XML로 설정하는 방법 (0) | 2023.10.13 |