Sql Alchemy Что не так? - PullRequest
       8

Sql Alchemy Что не так?

11 голосов
/ 12 января 2010

Я получил учебник

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

При компиляции получено сообщение об ошибке

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

Я использую последнюю версию sqlAlchemy.

Как я мог это исправить?

После прочтения я изменил свой собственный для последней версии sqlAlchemy:

from sqlalchemy import *
engine = create_engine('mysql://root:mypassword@localhost/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

Это поднимает ошибку

 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' ()

Ответы [ 3 ]

24 голосов
/ 17 июня 2012

Исправление для учебника - просто использовать MetaData вместо BoundMetaData. BoundMetaData устарела и заменена метаданными.

И чтобы избежать появления такой ошибки в будущем, попробуйте вместо нее official , как сказал Nosklo.

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
"""
17 голосов
/ 12 января 2010

Это руководство предназначено для SQLAlchemy версии 0.2. Поскольку текущая версия - 0.5.7, я бы сказал, что учебник сильно устарел.

Вместо этого попробуйте официальный .


EDIT:

Теперь у вас совершенно другой вопрос. Вы должны были задать другой вопрос вместо того, чтобы редактировать этот.

Ваша проблема сейчас в том, что

Column('password', String),

Не указывает размер для столбца.

Попробуйте

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

Вместо.

2 голосов
/ 12 января 2010

Полагаю, вам нужно указать длину поля password.

Column('password', String(100))

MySQL не допускает неограниченные столбцы varchar. Если вам это нужно, используйте вместо этого тип данных sqlalchemy Text.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...