Уведомления

Группа в Telegram: @pythonsu

#1 Окт. 24, 2011 18:27:53

Hayate
От:
Зарегистрирован: 2010-10-15
Сообщения: 34
Репутация: +  1  -
Профиль   Отправить e-mail  

SQLAlchemy 0.7, первые шаги

Не могу понять, где косяк в коде, делаю всё по примерам (http://ru.wikibooks.org/wiki/SQLAlchemy):
Пытаюсь написать второй вариант, декларативный.

from sqlalchemy.ext.declarative import declarative_base
from sqlalchemy import Table, Column, Integer, String, MetaData, ForeignKey, create_engine
from sqlalchemy.orm import sessionmaker

Base = declarative_base()
class User(Base):
__tablename__ = 'users'
id = Column(Integer, primary_key=True)
name = Column(String)
fullname = Column(String)
password = Column(String)

def __init__(self, name, fullname, password):
self.name = name
self.fullname = fullname
self.password = password
def __repr__(self):
return "<User('%s','%s', '%s')>" % (self.name, self.fullname, self.password)

users_table = User.__table__
print(users_table)
metadata = Base.metadata
print(metadata)


engine = create_engine('sqlite:///file.db', echo=True)

Session = sessionmaker(bind=engine)
session = Session()

vasiaUser = User('vasia', 'Vasiliy Pypkin', 'vasia2000')
romaUser = User('roman', 'Roman Romanov', 'roma3000')
session.add(vasiaUser)
session.add(romaUser)
session.commit()

ourUser = session.query(User).filter_by(name="roman").first()
Ошибка:
C:\Python32\python.exe C:/Users/Егор/Desktop/prof_db/play.py
users
MetaData(bind=None)
2011-10-24 22:15:01,125 INFO sqlalchemy.engine.base.Engine BEGIN (implicit)
2011-10-24 22:15:01,127 INFO sqlalchemy.engine.base.Engine INSERT INTO users (name, fullname, password) VALUES (?, ?, ?)
2011-10-24 22:15:01,127 INFO sqlalchemy.engine.base.Engine ('vasia', 'Vasiliy Pypkin', 'vasia2000')
2011-10-24 22:15:01,127 INFO sqlalchemy.engine.base.Engine ROLLBACK
Traceback (most recent call last):
File "C:\Python32\lib\site-packages\sqlalchemy\engine\base.py", line 1633, in _execute_context
context)
File "C:\Python32\lib\site-packages\sqlalchemy\engine\default.py", line 332, in do_execute
cursor.execute(statement, parameters)
sqlite3.OperationalError: no such table: users

The above exception was the direct cause of the following exception:

Traceback (most recent call last):
File "C:/Users/Егор/Desktop/prof_db/play.py", line 35, in <module>
session.commit()
File "C:\Python32\lib\site-packages\sqlalchemy\orm\session.py", line 645, in commit
self.transaction.commit()
File "C:\Python32\lib\site-packages\sqlalchemy\orm\session.py", line 313, in commit
self._prepare_impl()
File "C:\Python32\lib\site-packages\sqlalchemy\orm\session.py", line 297, in _prepare_impl
self.session.flush()
File "C:\Python32\lib\site-packages\sqlalchemy\orm\session.py", line 1547, in flush
self._flush(objects)
File "C:\Python32\lib\site-packages\sqlalchemy\orm\session.py", line 1616, in _flush
flush_context.execute()
File "C:\Python32\lib\site-packages\sqlalchemy\orm\unitofwork.py", line 328, in execute
rec.execute(self)
File "C:\Python32\lib\site-packages\sqlalchemy\orm\unitofwork.py", line 472, in execute
uow
File "C:\Python32\lib\site-packages\sqlalchemy\orm\mapper.py", line 2220, in _save_obj
execute(statement, params)
File "C:\Python32\lib\site-packages\sqlalchemy\engine\base.py", line 1399, in execute
params)
File "C:\Python32\lib\site-packages\sqlalchemy\engine\base.py", line 1532, in _execute_clauseelement
compiled_sql, distilled_params
File "C:\Python32\lib\site-packages\sqlalchemy\engine\base.py", line 1640, in _execute_context
context)
File "C:\Python32\lib\site-packages\sqlalchemy\engine\base.py", line 1777, in _handle_dbapi_exception
from e
sqlalchemy.exc.OperationalError: (OperationalError) no such table: users 'INSERT INTO users (name, fullname, password) VALUES (?, ?, ?)' ('vasia', 'Vasiliy Pypkin', 'vasia2000')

Process finished with exit code 1



Отредактировано (Окт. 24, 2011 18:38:51)

Офлайн

#2 Окт. 25, 2011 07:16:32

PooH
От:
Зарегистрирован: 2006-12-05
Сообщения: 1948
Репутация: +  72  -
Профиль   Отправить e-mail  

SQLAlchemy 0.7, первые шаги

Не вижу создания таблиц metadata.create_all(bind=engine)



Вот здесь один из первых отарков съел лаборанта. Это был такой умный отарк, что понимал даже теорию относительности. Он разговаривал с лаборантом, а потом бросился на него и загрыз…

Офлайн

#3 Окт. 31, 2011 07:48:59

Hayate
От:
Зарегистрирован: 2010-10-15
Сообщения: 34
Репутация: +  1  -
Профиль   Отправить e-mail  

SQLAlchemy 0.7, первые шаги

PooH
Не вижу создания таблиц metadata.create_all(bind=engine)
Спасибо, добавлять в таблицу информацию стал, а запросы не выполняются :( Туплю всё ещё
Судя по примеру http://ru.wikibooks.org/wiki/SQLAlchemy должно выйти в консоли такое:

>>> ourUser = session.query(User).filter_by(name="vasia").first()
<User('vasia','Vasiliy Pypkin', 'vasia2000')>
а имеем такой вывод:

C:\Python32\python.exe C:/Users/Егор/Desktop/prof_db/simple.py
2011-10-31 13:26:21,128 INFO sqlalchemy.engine.base.Engine PRAGMA table_info("users")
2011-10-31 13:26:21,128 INFO sqlalchemy.engine.base.Engine ()
2011-10-31 13:26:21,130 INFO sqlalchemy.engine.base.Engine
CREATE TABLE users (
id INTEGER NOT NULL,
name VARCHAR,
fullname VARCHAR,
password VARCHAR,
PRIMARY KEY (id)
)


2011-10-31 13:26:21,130 INFO sqlalchemy.engine.base.Engine ()
2011-10-31 13:26:21,130 INFO sqlalchemy.engine.base.Engine COMMIT
2011-10-31 13:26:21,131 INFO sqlalchemy.engine.base.Engine BEGIN (implicit)
2011-10-31 13:26:21,138 INFO sqlalchemy.engine.base.Engine INSERT INTO users (name, fullname, password) VALUES (?, ?, ?)
2011-10-31 13:26:21,138 INFO sqlalchemy.engine.base.Engine ('vasia', 'Vasiliy Pypkin', 'vasia2000')
2011-10-31 13:26:21,138 INFO sqlalchemy.engine.base.Engine SELECT users.id AS users_id, users.name AS users_name, users.fullname AS users_fullname, users.password AS users_password
FROM users
WHERE users.name = ?
LIMIT ? OFFSET ?
2011-10-31 13:26:21,138 INFO sqlalchemy.engine.base.Engine ('vasia', 1, 0)

Process finished with exit code 0
Само приложение:
# -*- coding: utf-8 -*-
__author__ = 'Егор'


from sqlalchemy import Column, Integer, String, create_engine
from sqlalchemy.ext.declarative import declarative_base

engine = create_engine('sqlite:///:memory:', echo=True)
Base = declarative_base()
class User(Base):
__tablename__ = 'users'
id = Column(Integer, primary_key=True)
name = Column(String)
fullname = Column(String)
password = Column(String)

def __init__(self, name, fullname, password):
self.name = name
self.fullname = fullname
self.password = password
def __repr__(self):
return "<User('%s','%s', '%s')>" % (self.name, self.fullname, self.password)

users_table = User.__table__
metadata = Base.metadata

from sqlalchemy.orm import sessionmaker
Session = sessionmaker(bind=engine)

Session = sessionmaker()

Session.configure(bind=engine)

session = Session()

metadata.create_all(bind=engine)

vasiaUser = User("vasia", "Vasiliy Pypkin", "vasia2000")
session.add(vasiaUser)

ourUser = session.query(User).filter_by(name="vasia").first()



Офлайн

#4 Окт. 31, 2011 09:39:54

PooH
От:
Зарегистрирован: 2006-12-05
Сообщения: 1948
Репутация: +  72  -
Профиль   Отправить e-mail  

SQLAlchemy 0.7, первые шаги

Тот пример выполняют в интерактивной консоле, в ней автоматом выводятся значения выражений. Хотите видеть вывод в скрипте - добавьте

print vasiaUser
print ourUser



Вот здесь один из первых отарков съел лаборанта. Это был такой умный отарк, что понимал даже теорию относительности. Он разговаривал с лаборантом, а потом бросился на него и загрыз…

Офлайн

#5 Окт. 31, 2011 09:54:39

Hayate
От:
Зарегистрирован: 2010-10-15
Сообщения: 34
Репутация: +  1  -
Профиль   Отправить e-mail  

SQLAlchemy 0.7, первые шаги

PooH
Тот пример выполняют в интерактивной консоле, в ней автоматом выводятся значения выражений. Хотите видеть вывод в скрипте - добавьте
print vasiaUser
print ourUser
Спасибо!
В последнее время проявляю незаурядное тугодумство.



Офлайн

#6 Янв. 5, 2012 09:41:55

Hayate
От:
Зарегистрирован: 2010-10-15
Сообщения: 34
Репутация: +  1  -
Профиль   Отправить e-mail  

SQLAlchemy 0.7, первые шаги

Почему не работает engine = create_engine('sqlite:///file.db', echo = False) ? Вывод как шёл в консоль, так и идёт
engine.echo = False тоже ничего не меняет.



Офлайн

#7 Янв. 5, 2012 10:16:02

Hayate
От:
Зарегистрирован: 2010-10-15
Сообщения: 34
Репутация: +  1  -
Профиль   Отправить e-mail  

SQLAlchemy 0.7, первые шаги

Если что, речь идёт и логе событий в PyCharm.



Офлайн

Board footer

Модераторировать

Powered by DjangoBB

Lo-Fi Version