bmstu.py lecture 5

aori.ru

			bmstu.py
		

План лекции

но сначала...

Чем плохи файлы для хранения данных?

Реляционные базы данных

реляционный (лат) - "хранящий данные в табличечках".

Популярные СУБД

Популярные СУБД

SQL


			SELECT, WHERE, GROUP BY, HAVING, ORDER BY,
			JOIN, INSERT, UPDATE, CREATE, DELETE
		

Чеклист для БД любого проекта

 


     SELECT * FROM users WHERE login='ilebedev';
		

 

engine.execute(
    "SELECT * FROM users WHERE login='ilebedev';"
)
		

 

users = engine.execute(
    "SELECT * FROM users WHERE login='ilebedev';"
).fetchall()
		

 

def get_users(login):
	return engine.execute(
    	"SELECT * FROM users WHERE login='%s';" % login
	).fetchall()
		

 

def get_users(login):
	return engine.execute(
    	"SELECT * FROM users WHERE login='%s';" % login
	).fetchall()
		

 

def get_users(login):
	return engine.execute(
    	"SELECT * FROM users WHERE login='%s';" % login
	).fetchall()



get_users("' OR '1' = '1")  # вернёт ВСЕХ пользователей
		

SQL injection

def get_users(login):
	return engine.execute(
    	"SELECT * FROM users WHERE login='%s';" % login
	).fetchall()



get_users("' OR '1' = '1")  # вернёт ВСЕХ пользователей
		

SQL injection

def get_users(login):
	return engine.execute(
    	"SELECT * FROM users WHERE login='%s';" % login
	).fetchall()



get_users("' OR '1' = '1")  # вернёт ВСЕХ пользователей
# SELECT * FROM users WHERE login='' OR '1' = '1'
		

SQL injection

def get_users(login):
	return engine.execute(
    	"SELECT * FROM users WHERE login='%s';" % login
	).fetchall()
		

SQL injection

def get_users(login):
	return engine.execute(
    	"SELECT * FROM users WHERE login=?;", login
	).fetchall()
		

 

def get_users(login, only_active=False):
	query = "SELECT * FROM users WHERE login=?"
	if only_active:
		query += " AND is_active"
	return engine.execute(query, login).fetchall()
		

 

def get_users(login, only_active=False, with_statistics=False):
	query = "SELECT * FROM users WHERE login=?"
	if only_active:
		query += " AND is_active"
	if with_statistics:
		query += "JOIN user_stat ON user_stat.user_id = user.id"
	return engine.execute(query, login).fetchall()
		

 

def get_users(login, only_active=False):
	users = User.filter(login=login)
	if only_active:
		users = users.active()
	return users
		

ORM

def get_users(login, only_active=False):
	users = User.filter(login=login)
	if only_active:
		users = users.active()
	return users
		

ORM

def get_users(login, only_active=False):
	users = User.filter(login=login)
	if only_active:
		users = users.active()
	return users


for user in get_users('bmstu.py'):
	print user.id
		

ORM

aori_session.query(
        payment.CurrencyRate.rate,
        payment.CurrencyRate.date_start
    ).filter(
        and_(
            payment.CurrencyRate.date_start <= date_to,
            payment.CurrencyRate.currency.in_(currency_types),
            or_(
                payment.CurrencyRate.date_stop == None,
                payment.CurrencyRate.date_stop >= date_from,
            )
        )
    ).order_by(
        payment.CurrencyRate.date_start,
    )

Популярные ORM

Модель


class User(AbstractCore):
    id = Column(BigInteger, primary_key=True)
    email = Column(String(255), nullable=False)
    first_name = Column('fname', String(255, convert_unicode=True), nullable=True)
    last_name = Column('lname', String(255, convert_unicode=True), nullable=True)
    middle_name = Column('mname', String(255, convert_unicode=True), nullable=True)
		

Модель


class User(AbstractCore):
    id = Column(BigInteger, primary_key=True)
	...

	def is_user_online(self):
		online_user_ids = [s.user_id for s in get_sessions()]
		return self.id in online_user_ids
		

Шаблон


<body>
	Список статей:
	<ul>
	{% for article in articles %}
		<li>{{ article.title }} ({{ article.author }})</li>
	{% endfor %}
	</ul>
</body>
		

 

 

 

Model-View-Controller

Model-View-Controller

Model-View-Controller

Исключения

page_num = int(
	raw_input(u'Введите номер страницы: ')
)
		

 

Заходит однажды тестировщик в бар.
Забегает в бар.
Пролезает в бар.
Танцуя, проникает в бар.
Крадется в бар.
Врывается в бар.
Прыгает в бар.

 

и заказывает:
кружку пива,
2 кружки пива,
0 кружек пива,
999999999 кружек пива,
ящерицу в стакане,
–1 кружку пива,
ававав кружек пива.

Исключения

page_num = int(
	raw_input(u'Введите номер страницы: ')
)
		

Исключения

page_num = int(
	raw_input(u'Введите номер страницы: ')
)
		

ValueError: invalid literal for int() with base 10: 'avavav'
		

Исключения

BaseException
 +-- KeyboardInterrupt
 +-- Exception
      +-- StopIteration
      +-- StandardError
      |    +-- BufferError
      |    +-- ArithmeticError
      |    +-- ImportError
      |    +-- ValueError
		   +-- ...
	  +-- ...
		

Исключения

try:
    page_num = int(
		raw_input(u'Введите номер страницы: ')
	)
except ValueError:
	print 'Incorrect integer value'
		

Исключения

# paginator.py
try:
    page_num = int(
		raw_input(u'Введите номер страницы: ')
	)
except ValueError:
	print 'Incorrect integer value'

$ python paginator.py
Incorrect integer value
		

Исключения

# paginator.py
try:
    page_num = int(
		raw_input(u'Введите номер страницы: '.encode('utf-8'))
	)
except ValueError:
	print 'Incorrect integer value'

$ python paginator.py
Incorrect integer value
		

Исключения


BaseException
 +-- KeyboardInterrupt
 +-- Exception
      +-- StopIteration
      +-- StandardError
      |    +-- BufferError
      |    +-- ArithmeticError
      |    +-- ImportError
      |    +-- ValueError
      |         +-- UnicodeError
		   +-- ...
	  +-- ...
		

Исключения

# paginator.py
try:
    page_num = int(
		raw_input(u'Введите номер страницы: '.encode('utf-8'))
	)
except ValueError:
	print 'Incorrect integer value'

$ python paginator.py
Incorrect integer value
		

Исключения

# paginator.py
try:
    page_num = int(
		raw_input(u'Введите номер страницы: '.encode('utf-8'))
	)
except Exception:  # :(
	print 'Incorrect integer value'

$ python paginator.py
Incorrect integer value
		

Исключения

vk_client.get_friends(online=True)
		

Исключения

try:
    vk_client.get_friends(online=True)
except Exception as e:
	print 'Unhandled exception happened: %s' % e
	raise e
		

Исключения

try:
    vk_client.get_friends(online=True)
except Exception as exception:
	print 'Unhandled exception happened: %s' % exception
	raise exception
		

Исключения

Логирование

Логирование

Чем logging круче, print:

Логирование

import logging
logger = logging.getLogger()
logger.setLevel(logging.DEBUG)

for friend in vk_api.get_friends():
	logger.debug('processing %s...' % friend)
		try:
			print vk_api.get_audios(friend.id)
		except VkApiError:
			logger.error('API error occured')
	logger.debug('\tfinished')
		

Логирование

import logging
logger = logging.getLogger()
logger.setLevel(logging.DEBUG)

for friend in vk_api.get_friends():
	logger.debug('processing %s...' % friend)
		try:
			print vk_api.get_audios(friend.id)
		except VkApiError:
			logger.error('API error occured')
	logger.debug('\tfinished')
		

Логирование

import logging
logger = logging.getLogger()
logger.setLevel(logging.DEBUG)

for friend in vk_api.get_friends():
	logger.debug('processing %s...' % friend)
		try:
			print vk_api.get_audios(friend.id)
		except VkApiError:
			logger.error('API error occured')
	logger.debug('\tfinished')
		

Логирование

import logging
logger = logging.getLogger()
logger.setLevel(logging.DEBUG)

for friend in vk_api.get_friends():
	logger.debug('processing %s...' % friend)
		try:
			print vk_api.get_audios(friend.id)
		except VkApiError:
			logger.error('API error occured')
	logger.debug('\tfinished')
		

Логирование

import logging
logger = logging.getLogger()
logger.setLevel(logging.DEBUG)

for friend in vk_api.get_friends():
	logger.debug('processing %s...' % friend)
		try:
			print vk_api.get_audios(friend.id)
		except VkApiError:
			logger.error('API error occured')
	logger.debug('\tfinished')
		

Логирование

import logging
logger = logging.getLogger()
logger.setLevel(logging.ERROR)

for friend in vk_api.get_friends():
	logger.debug('processing %s...' % friend)
		try:
			print vk_api.get_audios(friend.id)
		except VkApiError:
			logger.error('API error occured')
	logger.debug('\tfinished')
		

ДЗ

ДЗ

ДЗ

ДЗ

Практикум

его нет