如何在MySQL数据库上保存python对象?
我试图使用python中的一个对象示例创建一个数据库,但我收到了如下错误消息: “AttributeError:'Eu'对象没有属性'translate'” 我不知道如何解决这个问题 对不起,伙计们,我的英语不是很好 这是我的密码:如何在MySQL数据库上保存python对象?,python,mysql,python-3.x,class,object,Python,Mysql,Python 3.x,Class,Object,我试图使用python中的一个对象示例创建一个数据库,但我收到了如下错误消息: “AttributeError:'Eu'对象没有属性'translate'” 我不知道如何解决这个问题 对不起,伙计们,我的英语不是很好 这是我的密码: import pymysql.cursors class Eu: def __init__(self, nome='mel', idade=22): self.nome = nome self.idade = idade
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'
runfile('C:/Users/Usuario/.spyder-py3/temp.py',wdir='C:/Users/Usuario/.spyder-py3')
回溯(最近一次呼叫最后一次):
文件“”,第1行,在
运行文件('C:/Users/Usuario/.spyder-py3/temp.py',wdir='C:/Users/Usuario/.spyder-py3')
文件“C:\Users\Usuario\Anaconda3\lib\site packages\spyder\utils\site\sitecustomize.py”,第880行,在runfile中
execfile(文件名、命名空间)
文件“C:\Users\Usuario\Anaconda3\lib\site packages\spyder\utils\site\sitecustomize.py”,第102行,在execfile中
exec(编译(f.read(),文件名,'exec'),命名空间)
文件“C:/Users/Usuario/.spyder-py3/temp.py”,第36行,在
conn.cursor().execute(“”插入到tabela73值(?),(eu))
文件“C:\Users\Usuario\Anaconda3\lib\site packages\pymysql\cursors.py”,第168行,执行
query=self.mogrify(query,args)
文件“C:\Users\Usuario\Anaconda3\lib\site packages\pymysql\cursors.py”,mogrify中第147行
查询=查询%self.\u转义\u参数(参数,conn)
文件“C:\Users\Usuario\Anaconda3\lib\site packages\pymysql\cursors.py”,第133行,在参数中
返回连接逃逸(args)
文件“C:\Users\Usuario\Anaconda3\lib\site packages\pymysql\connections.py”,第839行,位于escape中
返回converters.escape_项(obj,self.charset,mapping=mapping)
文件“C:\Users\Usuario\Anaconda3\lib\site packages\pymysql\converters.py”,第27行,在escape\u项中
val=编码器(val,映射)
文件“C:\Users\Usuario\Anaconda3\lib\site packages\pymysql\converters.py”,第118行,转义码
返回u“'%s'%”\u转义\u unicode(值)
文件“C:\Users\Usuario\Anaconda3\lib\site packages\pymysql\converters.py”,第73行,采用unicode格式
返回值.translate(_escape_表)
AttributeError:“Eu”对象没有属性“translate”
不能将python对象直接存储在关系数据库中。您要做的是存储可用于在需要时重新生成对象的数据
有一些模块可以帮助实现这一点。它们被称为ORM-对象关系模型
我推荐炼金术:
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)
我不确定你希望在这里保存什么。MySQL对您的Eu类一无所知。您需要将nome和idade字段保存在单独的列中;您可以使用对象关系映射器(如peewee或SQLAlchemy)为您实现自动化。@Daniel我已经研究了SQLAlchemy和Djangorm。这两个库都是维护良好且可扩展的库。然而,我正在做一个小项目,ORM在这方面似乎有点过头了。有没有其他更简单的方法来实现这一点?