Sqlalchemy / Flask / Postgres ProgrammingError:<unprintable programmingerror =“”object =“”> </unprintable>

时间:2014-12-31 03:46:30

标签: python postgresql python-2.7 flask sqlalchemy

我正在Flask中设置一个应用程序,我刚刚在我的数据库模式中引入了一个新表“StudyGroup”。我还在测试所以我只是在创建加载数据库,直到一切正常。我在我的用户模型中使用Flask-Security,这是UserMixin部分的来源。

在尝试创建并提交其中一个新对象时,Sqlalchemy正在给我一个 "ProgrammingError: <unprintable ProgrammingError object>"错误 我完全被它的意思所困扰。下面的代码片段和完整的追溯......

Models.py代码:

from app import db
from flask.ext.security import Security, SQLAlchemyUserDatastore, UserMixin, RoleMixin, login_required

class User(db.Model, UserMixin):  
    id = db.Column(db.Integer, primary_key = True)
    username = db.Column(db.String(64), index = True)
    user_groups=db.relationship('Studygroup',
        secondary=users_x_groups,
        backref = db.backref('group_members', lazy = 'dynamic'),
        lazy='dynamic') 
    groups_founded = db.relationship("Studygroup", backref="group_founder")



class Studygroup(db.Model): #can't reduce this any further because I don't know what's blowing up
    id = db.Column(db.Integer, primary_key=True)
    created=db.Column(db.DateTime())
    founder = db.Column(db.Integer, db.ForeignKey('user.id'))
    groupname=db.Column(db.String(255))
    about = db.Column(db.Text)
    locationstr=db.Column(db.String(255))
    zipcode=db.Column(db.String(5))
    profilepiclink=db.Column(db.String(140))
    latitude=db.Column(db.Float())
    longitude=db.Column(db.Float())
    openclosed= db.Column(db.SmallInteger)
    group_topics=db.relationship('Topic',
        secondary=groups_x_topics,
        backref = db.backref('topic_groups', lazy = 'dynamic'),
        lazy='dynamic')
    group_courses=db.relationship('Course',
        secondary=groups_x_courses,
        backref = db.backref('course_groups', lazy = 'dynamic'),
        lazy='dynamic')
    group_events = db.relationship("Event", backref="studygroup")
    group_posts = db.relationship("Post", backref="studygroup")

    def __init__(self, founderid,groupname,about=None,locationstr=None,zipcode='00000',profilepiclink=None,openclosed=1,topicids=[],courseids=[]):
        self.created=datetime.datetime.utcnow()
        founder=User.query.get(founderid) #I've tried this with a User instead of an integer input, same error
        self.founder=founder
        self.groupname=groupname
        self.about=about
        self.locationstr=locationstr
        self.zipcode=zipcode
        self.profilepiclink=profilepiclink
        self.openclosed=1 #all groups default to open
        for topicid in topicids:
            self.group_topics.append(topicid)
        for courseid in courseids:
            self.group_courses.append(courseid)
        self.group_members.append(founder) 
        if zipcode=='00000':
            self.latitude=90.00
            self.longitude=0.00000
        else:
            (self.latitude, self.longitude)=eval(r.get("zipcode:"+str(zipcode))) #TESTING

db_populate.py代码:     来自app import app,db,user_datastore     从app.models导入课程,用户,学习组,主题,事件     导入回溯     导入集合

def dropit_popit():
    db.session.commit() #prevents an error
    db.drop_all()
    with app.app_context():
        db.create_all()
    u2=collections.defaultdict()
    u2[0] = MakeUserInDb('Alex','<email redacted>','password','94110')
    for x in range(1,20):
        if x%10==0: print x
        if x%10: db.session.commit()
        usethiszip=random.choice(possiblezips)
        u2[x]=MakeUserInDb(username="TEST", email='User'+str(x)+'@User.com', password='password', zipcode=usethiszip)
    uuuu=User.query.get(1) #Earlier, tried using User instead of userid with lookup to fix
    print uuuu  #returns the first user I made

    #note: All of the above works for creating users etc. I recently introduced Studygroup and that's what I'm testing.

    try:
        dat_groop=Studygroup(1,"TESTGROUP",about="Dis be group",locationstr="Frisco",zipcode='94110',profilepiclink=None,openclosed=1,topicids=[],courseids=[])
        db.session.add(dat_groop)
        db.session.commit() #THIS IS WHERE THE ERROR HAPPENS
    except:
        print traceback.print_exc()

追溯:

Traceback (most recent call last):

      File "db_populate.py", line 139, in dropit_popit
    db.session.commit()
  File "/Library/Python/2.7/site-packages/sqlalchemy/orm/scoping.py", line 114, in do
    return getattr(self.registry(), name)(*args, **kwargs)
  File "/Library/Python/2.7/site-packages/sqlalchemy/orm/session.py", line 703, in commit
    self.transaction.commit()
  File "/Library/Python/2.7/site-packages/sqlalchemy/orm/session.py", line 361, in commit
    self._prepare_impl()
  File "/Library/Python/2.7/site-packages/sqlalchemy/orm/session.py", line 340, in _prepare_impl
    self.session.flush()
  File "/Library/Python/2.7/site-packages/sqlalchemy/orm/session.py", line 1718, in flush
    self._flush(objects)
  File "/Library/Python/2.7/site-packages/sqlalchemy/orm/session.py", line 1789, in _flush
    flush_context.execute()
  File "/Library/Python/2.7/site-packages/sqlalchemy/orm/unitofwork.py", line 331, in execute
    rec.execute(self)
  File "/Library/Python/2.7/site-packages/sqlalchemy/orm/unitofwork.py", line 475, in execute
    uow
  File "/Library/Python/2.7/site-packages/sqlalchemy/orm/persistence.py", line 64, in save_obj
    table, insert)
  File "/Library/Python/2.7/site-packages/sqlalchemy/orm/persistence.py", line 558, in _emit_insert_statements
    execute(statement, params)
  File "/Library/Python/2.7/site-packages/sqlalchemy/engine/base.py", line 1449, in execute
    params)
  File "/Library/Python/2.7/site-packages/sqlalchemy/engine/base.py", line 1584, in _execute_clauseelement
    compiled_sql, distilled_params
  File "/Library/Python/2.7/site-packages/sqlalchemy/engine/base.py", line 1698, in _execute_context
    context)
  File "/Library/Python/2.7/site-packages/sqlalchemy/engine/base.py", line 1691, in _execute_context
    context)
  File "/Library/Python/2.7/site-packages/sqlalchemy/engine/default.py", line 331, in do_execute
    cursor.execute(statement, parameters)
ProgrammingError: <unprintable ProgrammingError object>

思考?我在这里做错了什么?

谢谢!

1 个答案:

答案 0 :(得分:1)

错误可能发生在您执行的地方

MakeUserInDb('Alex','<email redacted>','password','94110')

在另一条线上:

MakeUserInDb(username="TEST", email='User'+str(x)+'@User.com', password='password', zipcode=usethiszip)

在数据库中创建新对象时总是使用kwargs,就像在第二个示例中一样。你的错误的原因是类期望你可能没有把它们放入某个顺序的参数。当你使用kwargs时,顺序无关紧要。

旁注:我今天遇到了这个错误:

new_obj = MyObject(
    user_id=user_object
)

当我应该做的时候

new_obj = MyObject(
    user_id=user_object.id
)

user_id期待一个整数,我给它了User对象。不可否认,这是sqlalchemy的一个可怕的错误信息,但这是你如何解决它。

相关问题