Python:在sqlite3或mysql中存储字符串列表的正确方法。

11

我试图将一组字符串值存储到SQL数据库中。

list = ['please','help','me']

我尝试了将内容转换为unicode并使用array.array('u',list)

unicode_list = unicode(list)
array.array('u', list)

这不是我想要的结果。我不太关心在数据库中插入值后能否进行搜索。最后,我不想使用NOSQL替代方案。非常感谢您的帮助。提前致谢。


你是想把每个值存储在单独的行、单独的列还是一个列中?如果是一个列,考虑使用JSON或其他明确定义的序列化格式。 - Martijn Pieters
我只需要这个信息在一列中。 - django-d
2个回答

14

使用适当的序列化机制,例如JSON,并将其存储在文本字段中。

>>> json.dumps(['please','help','me'])
'["please", "help", "me"]'
>>> json.loads('["please", "help", "me"]')
[u'please', u'help', u'me']

谢谢,我在这里看到了一个类似的解决方案的参考链接:https://dev59.com/lmXWa4cB1Zd3GeqPJRXv,但我不确定它是否是一个合适的实现。使用这种技术会有什么后果吗? - django-d
将编码为JSON可以确保任何有问题的字符都被正确编码。 - Ignacio Vazquez-Abrams
@IgnacioVazquez-Abrams 请在链接上发布您的答案,这样人们就会被引入一个兔子洞。 - WinEunuuchs2Unix
json.dumps(['please','help','me'], ensure_ascii=False) - C.K.

2

补充Ignacio Vazquez-Abrams的回答,以下是完整的存储列表或列表列表到Sqlite数据库的步骤。

最初的回答:

>>> # Create dataframe
>>> df = pd.DataFrame({'Doc:': ["A", "B", "C"],
>>>                   'Doc_Pages': [31, 20, 45],
>>>                   'Data': [["A B C", "D E F"], ["G H I", "J K L"], ["M N O", "P Q R"]]
>>>                   })

>>> print(df)
Doc   Doc_Pages      Data
A       31       ["A B C", "D E F"]
B       20       ["G H I", "J K L"]
C       45       ["M N O", "P Q R"]

>>> # Create DB
>>> import sqlite3
>>> conn = sqlite3.connect('db.sqlite')
>>> cur = conn.cursor()
>>> cur.execute('CREATE TABLE IF NOT EXISTS TableName(ID INTEGER PRIMARY KEY AUTOINCREMENT)')

>>> # Store df into DB
>>> df.Data = df.Data.apply(lambda x: json.dumps(x))
>>> df.to_sql(name='Extracted_Data', con=conn, if_exists='replace')

>>> # Load df from DB
>>> df_new = pd.read_sql('SELECT * FROM TableName', con=conn)
>>> df_new.Data = df_new.Data.apply(lambda x: json.loads(x))

>>> print(df_new)
Doc   Doc_Pages      Data
A       31       ["A B C", "D E F"]
B       20       ["G H I", "J K L"]
C       45       ["M N O", "P Q R"]

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接