如何将Python对象保存到MySQL数据库中?

3
我正在尝试使用Python对象创建数据库示例,但我遇到了这样的错误消息: “AttributeError:'Eu'对象没有'translate'属性” 我不知道如何修复它。
抱歉,我的英语不是很好。 以下是我的代码:
import pymysql.cursors


class Eu:
    def __init__(self, nome='mel', idade=22):
        self.nome = nome
        self.idade = idade


eu = Eu()
nome = eu.nome
idade = eu.idade


# connect do database
conn = pymysql.connect(host='localhost',
                       user='root',
                       password='')

# create a cursor and a database
conn.cursor().execute('CREATE DATABASE banco73') 
conn.cursor().execute('USE banco73')

# create tables
conn.cursor().execute('CREATE TABLE tabela73 (eu BLOB)')

# use tables
conn.cursor().execute("""INSERT INTO tabela73 VALUES (?)""", (eu))

整个控制台信息:

runfile('C:/Users/Usuario/.spyder-py3/temp.py', wdir='C:/Users/Usuario/.spyder-py3')
Traceback (most recent call last):

  File "<ipython-input-59-9994dddea11c>", line 1, in <module>
    runfile('C:/Users/Usuario/.spyder-py3/temp.py', wdir='C:/Users/Usuario/.spyder-py3')

  File "C:\Users\Usuario\Anaconda3\lib\site-packages\spyder\utils\site\sitecustomize.py", line 880, in runfile
    execfile(filename, namespace)

  File "C:\Users\Usuario\Anaconda3\lib\site-packages\spyder\utils\site\sitecustomize.py", line 102, in execfile
    exec(compile(f.read(), filename, 'exec'), namespace)

  File "C:/Users/Usuario/.spyder-py3/temp.py", line 36, in <module>
    conn.cursor().execute("""INSERT INTO tabela73 VALUES (?)""", (eu))

  File "C:\Users\Usuario\Anaconda3\lib\site-packages\pymysql\cursors.py", line 168, in execute
    query = self.mogrify(query, args)

  File "C:\Users\Usuario\Anaconda3\lib\site-packages\pymysql\cursors.py", line 147, in mogrify
    query = query % self._escape_args(args, conn)

  File "C:\Users\Usuario\Anaconda3\lib\site-packages\pymysql\cursors.py", line 133, in _escape_args
    return conn.escape(args)

  File "C:\Users\Usuario\Anaconda3\lib\site-packages\pymysql\connections.py", line 839, in escape
    return converters.escape_item(obj, self.charset, mapping=mapping)

  File "C:\Users\Usuario\Anaconda3\lib\site-packages\pymysql\converters.py", line 27, in escape_item
    val = encoder(val, mapping)

  File "C:\Users\Usuario\Anaconda3\lib\site-packages\pymysql\converters.py", line 118, in escape_unicode
    return u"'%s'" % _escape_unicode(value)

  File "C:\Users\Usuario\Anaconda3\lib\site-packages\pymysql\converters.py", line 73, in _escape_unicode
    return value.translate(_escape_table)

AttributeError: 'Eu' object has no attribute 'translate'

1
我不确定你希望在这里保存什么。MySQL 不知道你的 Eu 类别。你需要将 nome 和 idade 字段保存在单独的列中;你可以使用 ORM 框架如 peewee 或 SQLAlchemy 来自动化此过程。 - Daniel Roseman
@Daniel 我已经探究了SQLAlchemy和DjangoORM。这两个库都是维护良好且非常可扩展的。然而,我正在处理一个小项目,ORM似乎有些大材小用。是否有其他更简单的方法来实现这个小项目呢? - Pratyush Raizada
2个回答

3

直接在关系型数据库中存储Python对象是不可行的。您需要存储可以在需要时重新生成对象的数据

有一些模块可以帮助处理此问题,它们被称为ORM - 对象关系模型。

我建议使用SQLAlchemy:

import sqlalchemy as sa
from sqlalchemy import Column, Integer, String, create_engine
from sqlalchemy.ext.declarative import declarative_base
from sqlalchemy.orm import sessionmaker

engine = create_engine('mysql://root:pwd@localhost/banco73')
Base = declarative_base(bind=engine)
Session = sessionmaker(bind=engine)

class Eu(Base):
    __tablename__ = 'tabela73'

    id = Column(Integer(), primary_key=True)
    nome = Column(String(200))
    idade = Column(Integer())

    def __init__(self, nome='mel', idade=22):
        self.nome = nome
        self.idade = idade

Base.metadata.create_all() 
# automatically generates a create table: 
#CREATE TABLE tabela73 (
#   id INTEGER NOT NULL, 
#   nome VARCHAR(200), 
#   idade INTEGER, 
#   PRIMARY KEY (id)
#)

eu = Eu()

session = Session()
session.add(eu)
session.commit() # automatically generates the insert:
#INSERT INTO tabela73 (nome, idade) VALUES ('mel', 22)

0
你可以使用Python的pickle来序列化对象。
在Python中,Pickling是一种将有时复杂的数据结构存储为二进制表示的方法,稍后可以取消Pickling以获取相同的数据结构。
注意: 要在MySQL上存储pickle数据,请使用Binary作为列类型。
示例:
    import pickle
    
    class MyClass:
       def __init__(self, name):
         self.name = name
         
    
    my_class = MyClass(name='Chuck Norris')
    
    # pickle
    my_data = pickle.dumps(my_class)


    # unpickle
    x = pickle.loads(my_data)

    print(x.name)
    # Output: Chuck Norris

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