2011-02-09 16 views
2
from sqlalchemy import create_engine 
from sqlalchemy import Table, Column, Integer, String, MetaData, ForeignKey 
from sqlalchemy.orm import mapper, sessionmaker 
from sqlalchemy.ext.declarative import declarative_base 

from bottle import route, post, get, request 
import os 

Base = declarative_base() 

class User(Base): 
    """Table for login details""" 
    __tablename__ = 'login_table' 
    id = Column(Integer, primary_key=True) 
    username = Column(String) 
    password = Column(String) 
    email = Column(String) 

    def __init__(self, username, password, email): 
     """Create a object containing info of a user""" 
     self.username = username 
     self.password = password 
     self.email = email 

    def __str__(self): 
     """Return a string representation""" 
     return self.username 

    def __repr__(self): 
     """Return a object representation""" 
     return "<User(%s)>" % self.username 

def force_engine(): 
    engine = create_engine('sqlite:///users.db', echo=True) 
    Base.metadata.create_all(engine) 
    Session = sessionmaker() 
    Session.configure(bind=engine) 
    session = Session() 
    session.commit() 

def spawn_session(): 
    engine = create_engine('sqlite:///users.db') 
    Session = sessionmaker() 
    Session.configure(bind=engine) 
    return Session() 

def create_user(username, password, email): 
    session = spawn_session() 
    session.add(User(username, password, email)) 
    session.commit() 
    return True 

def register_test(): 
    create_user('dave','test', 'a') 
    create_user('cat','123','a') 

if not os.path.exists('users.db'): 
    force_engine() 

@get('/register') 
def register_form(): 
    return '''<form method="POST"> 
       <p>Welcome new user. Enter a username, password, email.</p></br> 
       <p>Username: </p><input name="username" type="text" /></br> 
       <p>Password: </p><input name="password" type="password" /></br> 
       <p>Email: </p><input name="email" type="text" /></br> 
       <input type="submit" value="Submit" /> 
       </from>''' 

@post('/register') 
def register_submit(): 
    name  = request.forms.get('username') 
    password = request.forms.get('password') 
    email = request.forms.get('email') 
    authd = create_user(name, password, email) 
    if authd: 
     return "<p>User created</p>" 
    else: 
     return "<p>Failure</p>" 

這是我正在使用的代碼。不要告訴我有關安全或其他任何事情。只是幫助我弄清楚爲什麼它造成這種回溯SQLAlchemy的bug?我不確定

>>> register_test() 
Traceback (most recent call last): 
    File "<interactive input>", line 1, in <module> 
    File "C:\Users\Public\Documents\webapps\login\register.py", line 54, in register_test 
    create_user('dave','test', 'a') 
    File "C:\Users\Public\Documents\webapps\login\register.py", line 50, in create_user 
    session.commit() 
    File "C:\Python26\lib\site-packages\sqlalchemy-0.6.5-py2.6.egg\sqlalchemy\orm\session.py", line 623, in commit 
    self.transaction.commit() 
    File "C:\Python26\lib\site-packages\sqlalchemy-0.6.5-py2.6.egg\sqlalchemy\orm\session.py", line 385, in commit 
    self._prepare_impl() 
    File "C:\Python26\lib\site-packages\sqlalchemy-0.6.5-py2.6.egg\sqlalchemy\orm\session.py", line 369, in _prepare_impl 
    self.session.flush() 
    File "C:\Python26\lib\site-packages\sqlalchemy-0.6.5-py2.6.egg\sqlalchemy\orm\session.py", line 1397, in flush 
    self._flush(objects) 
    File "C:\Python26\lib\site-packages\sqlalchemy-0.6.5-py2.6.egg\sqlalchemy\orm\session.py", line 1478, in _flush 
    flush_context.execute() 
    File "C:\Python26\lib\site-packages\sqlalchemy-0.6.5-py2.6.egg\sqlalchemy\orm\unitofwork.py", line 304, in execute 
    rec.execute(self) 
    File "C:\Python26\lib\site-packages\sqlalchemy-0.6.5-py2.6.egg\sqlalchemy\orm\unitofwork.py", line 448, in execute 
    uow 
    File "C:\Python26\lib\site-packages\sqlalchemy-0.6.5-py2.6.egg\sqlalchemy\orm\mapper.py", line 1872, in _save_obj 
    execute(statement, params) 
    File "C:\Python26\lib\site-packages\sqlalchemy-0.6.5-py2.6.egg\sqlalchemy\engine\base.py", line 1191, in execute 
    params) 
    File "C:\Python26\lib\site-packages\sqlalchemy-0.6.5-py2.6.egg\sqlalchemy\engine\base.py", line 1271, in _execute_clauseelement 
    return self.__execute_context(context) 
    File "C:\Python26\lib\site-packages\sqlalchemy-0.6.5-py2.6.egg\sqlalchemy\engine\base.py", line 1302, in __execute_context 
    context.parameters[0], context=context) 
    File "C:\Python26\lib\site-packages\sqlalchemy-0.6.5-py2.6.egg\sqlalchemy\engine\base.py", line 1401, in _cursor_execute 
    context) 
    File "C:\Python26\lib\site-packages\sqlalchemy-0.6.5-py2.6.egg\sqlalchemy\engine\base.py", line 1394, in _cursor_execute 
    context) 
    File "C:\Python26\lib\site-packages\sqlalchemy-0.6.5-py2.6.egg\sqlalchemy\engine\default.py", line 299, in do_execute 
    cursor.execute(statement, parameters) 
OperationalError: (OperationalError) table login_table has no column named email u'INSERT INTO login_table (username, password, email) VALUES (?, ?, ?)' ('dave', 'test', 'a') 

即使我完全關閉蟒蛇,並刪除數據庫完全我仍然得到同樣的execption

+3

你確定你刪除正確的users.db文件?在create_engine()上打開echo = True,全部將顯示。 – zzzeek 2011-02-09 16:59:04

+0

。與回聲我看到它的工作正常,直到我嘗試添加一個用戶。 – 2011-02-09 22:32:29

回答

3

很不錯的寫在這裏有關使用SQLAlchemy的和SQLite在此tutorial

你需要確認你是至少版本的SQLAlchemy

0.7
>>> import sqlalchemy 
>>> sqlalchemy.__version__ 
0.7.0 

使用echo迪張開產生

>>> from sqlalchemy import create_engine 
>>> engine = create_engine('sqlite:///users.db', echo=True) 

的SQL,你可能已經錯過了這個非常重要的一步

>>> from sqlalchemy.ext.declarative import declarative_base 
>>> Base = declarative_base() 

終於驗證是否已創建表正確

>>> User.__table__ 
Table('users', MetaData(None), 
      Column('id', Integer(), table=<users>, primary_key=True, nullable=False), 
      Column('name', String(), table=<users>), 
      Column('username', String(), table=<users>), 
      Column('password', String(), table=<users>), 
      Column('email', String(), table=<users>), schema=None)