qre*_*0ct 4 python mysql pickle mysql-python
这件事已经困扰了我很长时间了。我通过序列化一些 Python Dict 对象生成了以下泡菜文件(名为 rawFile.raw):
rawFile.raw 的内容(为了易读性而被截断):
(dp0
S'request_body # 1'
p1
S''
p2
sS'port # 1'
p3
I80
sS'query_params # 1'
p4
ccopy_reg
_reconstructor
p5
(cnetlib.odict
ODict
p6
c__builtin__
object
p7
Ntp8
Rp9
(dp10
S'lst'
p11
(lp12
(S'layoutId'
p13
S'-1123196643'
p14
tp15
asbsS'headers # 1'
p16
g5
(cnetlib.odict
ODictCaseless
p17
g7
Ntp18
Rp19
(dp20
g11
(lp21
(lp22
S'sn'
p23
aS'2.VI7D9DF640615B4948854C88C5E769B94C.SIE5FB3A28D0DA4F27A3D2C03B8FAAFFAE.VS144257070601359422212.1442570840'
p24
aa(lp25
S'Browser-Name'
p26
aS'Mobile Safari'
p27
aa(lp28
S'Accept-Encoding'
p29
aS'gzip'
p30
aa(lp31
S'secureToken'
p32
aS'5nANXZrwYBrl9sNykA+qlpLsjHXlnF97tQLHnPgcjwZm9u0t8XAHtO4XTjKODcIb0ee4LlFchmUiptWZEPDUng=='
p33
aa(lp34
S'User-Agent'
p35
aS'Mozilla/5.0 (Linux; U; Android 4.3; en-us; Google Galaxy Nexus - 4.3 - API 18 - 720x1280 Build/JLS36G) AppleWebKit/534.30 (KHTML, like Gecko) Version/4.0 Mobile Safari/534.30 FKUA/Retail/590206/Android/Mobile (Genymotion/Google Galaxy Nexus - 4.3 - API 18 - 720x1280/fd6babaa1ff9127ed7e9cc7a916639e5)'
p36
aa(lp37
S'Device-Id'
p38
aS'fd6babaa1ff9127ed7e9cc7a916639e5'
p39
aa(lp40
S'Host'
p41
aS'mobileapi.flipkart.net'
p42
aa(lp43
S'Connection'
p44
aS'Keep-Alive'
p45
aasbsS'method # 1'
p46
S'GET'
p47
sS'scheme # 1'
p48
S'http'
p49
sS'path # 1'
p50
(lp51
S'3'
p52
aS'layout'
p53
aS'widget'
p54
aS'productBundle'
p55
as.(dp0
S'request_body # 1'
p1
S''
p2
sS'method # 1'
p3
S'GET'
p4
sS'query_params # 2'
p5
ccopy_reg
_reconstructor
p6
(cnetlib.odict
ODict
p7
c__builtin__
object
p8
Ntp9
Rp10
(dp11
S'lst'
p12
(lp13
sbsS'query_params # 1'
p14
Run Code Online (Sandbox Code Playgroud)
...更多类似的内容被截断。
现在我需要将此文件的内容存储在 MySql 表的一列中。通过一些谷歌搜索,我了解到这些应该存储在 BLOB 列中。所以我做了。此外,如果您观察到,上述内容有很多单引号和(可能有)双引号。我正在使用 MySqlDB python 连接器。因此,当我尝试在相应列中插入上述数据时:
INSERT INTO session_logs(request_as_on, session_pickle) VALUES (%s, %s)
Run Code Online (Sandbox Code Playgroud)
进而
self.cur.execute(insertValueQry,(parser.parse(reqTimeStamp).strftime('%Y-%m-%d %H:%M:%S'), putThisPickleInDb))
Run Code Online (Sandbox Code Playgroud)
我收到以下错误:
插入错误 1241 时出现 mysqldb 插入错误:操作数应包含 1 列
因此,为了解决上述问题,我将上面的执行语句替换为:
self.cur.execute(insertValueQry,(parser.parse(reqTimeStamp).strftime('%Y-%m-%d %H:%M:%S'), self.con.escape_string(str(putThisPickleInDb))))
Run Code Online (Sandbox Code Playgroud)
它通过从泡菜数据中转义所有单引号和双引号来解决这个问题。但它不会以与原始文件中相同的格式将数据存储在表中。
显然因此,现在当我需要从数据库读回这个泡菜内容时,
它仍然被转义 - 所以我执行以下操作来取消转义并获取原始内容:
aalu = "" <br>
aalu = aalu + str(userSelectedSessionPickle[0]).decode('string_escape').decode('string_escape')
Run Code Online (Sandbox Code Playgroud)其中 userSelectedSessionPickle 是从数据库返回的元组。
在取消转义之后,我尝试再次使用以下方法制作泡菜:
pickle.dump (aalu, currentPickleRawFile)
Run Code Online (Sandbox Code Playgroud)这样我就可以稍后加载泡菜文件并根据需要使用它。但是在文件 currentPickleRawFile 上执行 pickle.load 时,它会引发以下错误:
值错误:字典更新序列元素 #0 的长度为 1;2 是必需的
以防万一:当我在文本编辑器中打开文件 currentPickleRawFile 时,其中的内容格式与 rawFile.raw(内容如上所示)不同。
我所需要的只是将上述泡菜文件存储在数据库中,然后能够将其加载回来。我怎样才能做到这一点?
说我想出的解决方案是不公正的。我必须这样做,必须使这个天使的博客一提的是终于拯救了我,并帮我把我的工作做好是有几乎使我现在坚果。
http://blog.cameronleger.com/2011/05/31/python-example-pickling-things-into-mysql-databases/
看起来他将泡菜插入数据库的方式就是这样做的。
正如有人在下面的评论中所建议的那样,如果博客死了,我们将再次失去问题的解决方案。所以这里的代码片段,从博客文章中复制粘贴:
import cPickle
import MySQLdb
## Create a semi-complex list to pickle
listToPickle = [(10, 10), (20, 10.0), (1.0, 2.0)]
## Pickle the list into a string
pickledList = cPickle.dumps(listToPickle)
## Connect to the database as localhost, user pickle,
## password cucumber, database lists
connection = MySQLdb.connect('localhost','pickle','cucumber','lists')
## Create a cursor for interacting
cursor = connection.cursor()
## Add the information to the database table pickleTest
cursor.execute("""INSERT INTO pickleTest VALUES (NULL, 'testCard', %s)""", (pickledList, ))
## Select what we just added
cursor.execute("""SELECT features FROM pickleTest WHERE card = 'testCard'""")
## Dump the results to a string
rows = cursor.fetchall()
## Get the results
for each in rows:
## The result is also in a tuple
for pickledStoredList in each:
## Unpickle the stored string
unpickledList = cPickle.loads(pickledStoredList)
print unpickledList
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
10497 次 |
| 最近记录: |