2010-01-12 13 views
10

que tiene el tutorialSql Alquimia ¿Qué pasa?

http://www.rmunn.com/sqlalchemy-tutorial/tutorial.html

cuando compilo dieron el mensaje de error

The debugged program raised the exception unhandled NameError 
"name 'BoundMetaData' is not defined" 

Soy utilizar la última sqlalchemy.

¿Cómo puedo solucionar esto?

Después de leer esto modificada para mi propia para la versión más reciente sqlalchemy:

from sqlalchemy import * 
engine = create_engine('mysql://root:[email protected]/mysql') 
metadata = MetaData() 
users = Table('users', metadata, 
    Column('user_id', Integer, primary_key=True), 
    Column('name', String(40)), 
    Column('age', Integer), 
    Column('password', String), 
) 
metadata.create_all(engine) 
i = users.insert() 
i.execute(name='Mary', age=30, password='secret') 
i.execute({'name': 'John', 'age': 42}, 
      {'name': 'Susan', 'age': 57}, 
      {'name': 'Carl', 'age': 33}) 
s = users.select() 
rs = s.execute() 
row = rs.fetchone() 
print 'Id:', row[0] 
print 'Name:', row['name'] 
print 'Age:', row.age 
print 'Password:', row[users.c.password] 
for row in rs: 
    print row.name, 'is', row.age, 'years old 

Se elevar error

raise exc.DBAPIError.instance(statement, parameters, e, connection_invalidated=is_disconnect) 
sqlalchemy.exc.ProgrammingError: (ProgrammingError) (1064, "You have an error in your SQL syntax; check the manual that corresponds to your MySQL server version for the right syntax to use near ' \n\tPRIMARY KEY (user_id)\n)' at line 5") '\nCREATE TABLE users (\n\tuser_id INTEGER NOT NULL AUTO_INCREMENT, \n\tname VARCHAR(40), \n\tage INTEGER, \n\tpassword VARCHAR, \n\tPRIMARY KEY (user_id)\n)\n\n'() 

Respuesta

16

Este tutorial es para SQLAlchemy versión 0.2. Dado que la versión actual es 0.5.7, diría que el tutorial está muy desactualizado.

Pruebe el official uno en su lugar.


EDIT:

Ahora usted tiene una pregunta completamente diferente. Deberías haber hecho otra pregunta en lugar de editar esta.

Su problema ahora es que

Column('password', String), 

no especifica un tamaño para la columna.

Trate

Column('password', String(20)), 

lugar.

+2

@Nosklo. Muchísimas gracias. Es lo que quiero. – kn3l

+1

Ese enlace "oficial" está roto – dlchambers

+0

Creo que este es el enlace oficial en este momento: http://docs.sqlalchemy.org/en/latest/orm/tutorial.html –

2

Creo que necesita especificar la longitud de su campo password.

Column('password', String(100)) 

MySQL no permite columnas varchar ilimitadas. Si lo necesita, use el tipo de datos sqlalchemy Text en su lugar.

+0

yes.it funciona ... gracias alots codeape:) – kn3l

21

La solución para el tutorial es simplemente usar MetaData en lugar de BoundMetaData. BoundMetaData está en desuso y reemplazado con MetaData.

Y para evitar que se repita ese error en el futuro, pruebe official en su lugar, como Nosklo dijo.

from sqlalchemy import * 

db = create_engine('sqlite:///tutorial.db') 

db.echo = False # Try changing this to True and see what happens 

metadata = MetaData(db) 

""" 
    Continue with the rest of your Python code 
"""