我目前正在从sqlalchemy开始。在我目前的项目中,我必须在Flask和命令行的其他部分做一些工作。关于烧瓶的部分运行良好,与sqlalchemy和所有接口,但命令行部分不是。SQLAlchemy需要一个对象,但找到一个表
我得到的错误是
ArgumentError("Class object expected, got 'Table('documentos',
MetaData(bind=Engine(postgresql://user:[email protected]/clasificador)),
Column('id', Integer(), table=<documentos>, primary_key=True, nullable=False),
Column('nombre', String(length=248), table=<documentos>), schema=None)'.",)
我已经尽我的运气与谷歌和阅读声明SQLAlchemy的,但我找不到可能是什么问题。在模块中的代码是:
from sqlalchemy.orm import sessionmaker
from db import engine,Base
#some other code
session = sessionmaker(bind=engine)
doc = modelos.documento.Documento(os.path.basename(nelto))
session.add(doc) #here fails
session.remove()
db是模块,我有sqlalchemy的通用代码。大部分来自烧瓶文档,而db_session仅用于烧瓶,我为另一个模块做了一个不同的会话。
from sqlalchemy import create_engine
from sqlalchemy.orm import scoped_session, sessionmaker
from sqlalchemy.ext.declarative import declarative_base
sqldebug=True
engine = create_engine(
'postgresql://user:[email protected]/clasificador',
convert_unicode=True,
echo=sqldebug)
db_session = scoped_session(sessionmaker(autocommit=False,
autoflush=False,
bind=engine))
Base = declarative_base(bind=engine)
Base.query = db_session.query_property()
最后,这里是“documento”模块,虽然我怀疑问题在这里。 从SQLAlchemy的进口列,整数,从数据库导入基本字符串
class Documento(Base):
'''Clase definiendo los documentos'''
__tablename__ = "documentos"
id = Column(Integer,primary_key=True)
nombre = Column(String(248))
def __init__(self,nombre):
self.nombre = nombre
def __repr__(self):
return '<Documento %r>' % self.nombre
一些评论/名称是西班牙语,但我认为你可以放心地忽略他们,如果有必要,我会做翻译
继Lafada的代码中,我创建了另一个文件,只是:
from sqlalchemy.orm import sessionmaker
from modelos.documento import Documento
from db import Base, engine
import os
Session = sessionmaker(bind=engine)
session = Session()
doc = Documento(os.path.basename('/tmp/test.py')) #here fails
session.add(doc)
session.commit()
,它运行得很好。我能发现的唯一区别是会话是如何创建的,我已经在我的原始代码中修改了它,但它始终得到相同的错误。
我发现的罪魁祸首,它不是在我显示的代码上,而是在一个不同的类中试图创建与它的关系,但链接到表而不是对象。直到我尝试了其他几件事情,我无法追查它到真正的问题
这很奇怪,我已经运行你的代码(改变它为postgres),它运行良好,我已经重新安排它只是以下,它仍然运行(通过进口到其他部分代码) Session = sessionmaker(bind = engine) session = Session() doc = Documento(os.path.basename('/ tmp/test.py')) session.add(doc)#这里失败 session.commit() – Willyfrog
我修改了原来的问题来添加新代码,因为在这里看不到它 – Willyfrog
我终于重写了所有的代码,它的工作原理在不同的文件中几乎是一样的。 所以我给你答复,因为我从来没有试图写在另一个文件(并不应该是一个解决方案) – Willyfrog