Я пишу в базу данных в виде значков пользователей X одновременно и хочу обновить информацию о пользователе (заменить строку). Я хочу иметь только одну строку для каждого пользователя.
Однако при использовании параметра if_exists='replace'
новый значок заменяет старый значок (удаляя предыдущих -distinct- пользователей).
И если вместо этого я сделаю 'append'
, я получу множество дубликатов.
В моей таблице несколько столбцов в виде PK, поэтому я использую это определение из krvkir: https://stackoverflow.com/a/31045044/9153261
def to_sql_k(self, frame, name, if_exists='fail', index=False, index_label=None,
schema=None, chunksize=None, dtype=None, **kwargs):
'''Definition to add PK'''
if dtype is not None:
for col, my_type in dtype.items():
if not isinstance(to_instance(my_type), TypeEngine):
raise ValueError('The type of %s is not a SQLAlchemy '
'type ' % col)
table = pd.io.sql.SQLTable(name, self, frame=frame, index=index,
if_exists=if_exists, index_label=index_label,
schema=schema, dtype=dtype, **kwargs)
table.create()
table.insert(chunksize)
И я использую это другое определение для хранения информации в БД:
def writting_in_db(df, user_list, engine):
try:
ddtype={
'User': INTEGER,
'C1': INTEGER,
'C2': INTEGER
}
pandas_sql = pd.io.sql.pandasSQL_builder(engine)
to_sql_k(pandas_sql, df, 'TableName', keys=('User', 'C1'),
if_exists='append', dtype=ddtype)
except:
print("Exception, this list of users was not updated into database:\n")
sys.stdout.flush()
print(user_list)
sys.stdout.flush()
Любое решение, которое не «удаляет ВСЕ содержимое базы данных перед каждой итерацией»?
И, в идеале, это не так: «Опрашивать всех существующих пользователей в БД и выполнять итерацию, чтобы увидеть, присутствуют ли они в новом df для экспорта».
Salut,