Уведомления

Группа в Telegram: @pythonsu

#1 Авг. 2, 2007 19:25:29

niro
От:
Зарегистрирован: 2006-10-04
Сообщения: 178
Репутация: +  0  -
Профиль   Отправить e-mail  

sqlalchemy close connection

Вот обнаружилась странная вещь - при работе через sqlalchemy появляются sleep-процессы в списке процессов mysql. Если работать через mysqldb их не возникает, даже если их не закрывать коннекты. Возможно я неправильно делаю соединяюсь через sqlalchemy. Обычно пишу так, вроде по туториалу:

db = create_engine('mysql://root@localhost/somebase').connect()
posts = Table('posts', db, autoload = True)
users = Table('users', db, autoload = True)
forum_sub = Table('forum_sub', db, autoload = True)
….
db.close()



Офлайн

#2 Авг. 2, 2007 20:28:28

Андрей Светлов
От:
Зарегистрирован: 2007-05-15
Сообщения: 3137
Репутация: +  14  -
Профиль   Адрес электронной почты  

sqlalchemy close connection

Как я понимаю, ты пытаешься пересоздавать схему постоянно.
Так в алхимии, вообще-то, не принято.
Создаешь metadata (он же db) один раз за время жизни программы. Вполне подходит переменная модуля. Тут же описываешь свои таблицы.
Потом отовсюду строишь запросы, используюя эту метадату. И все. Ничего лишнего не возникает.

Может, я неправ. Но у меня работает именно так.



Офлайн

#3 Авг. 2, 2007 20:42:16

niro
От:
Зарегистрирован: 2006-10-04
Сообщения: 178
Репутация: +  0  -
Профиль   Отправить e-mail  

sqlalchemy close connection

Ну предположительно так

engine = create_engine('sqlite://', **kwargs)
meta = MetaData()
meta.connect(engine)
posts = Table('posts', meta, autoload = True)
...
А закрывать коннект то как ?



Офлайн

#4 Авг. 2, 2007 21:00:10

Андрей Светлов
От:
Зарегистрирован: 2007-05-15
Сообщения: 3137
Репутация: +  14  -
Профиль   Адрес электронной почты  

sqlalchemy close connection


connection = engine.connect()
result = connection.execute(“select username from users”)
for row in result:
print “username:”, row
connection.close()


или

result = engine.execute(“select username from users”)
for row in result:
print “username:”, row
result.close()

connection - это еще не engine.
Кстати, у тебя свежая алхимия? В закрытых тикетах что-то такое проскальзывало.
Да, еще.
engine использует ConnectionPool. Т.е. создает несколько connections и использует их. 5 штук по умолчанию.
Это позволяет сэкономить на постоянных переподключениях.
Может быть, именно их ты видишь?



Офлайн

#5 Авг. 3, 2007 15:25:10

niro
От:
Зарегистрирован: 2006-10-04
Сообщения: 178
Репутация: +  0  -
Профиль   Отправить e-mail  

sqlalchemy close connection

Да, вроде бы свежая - последний релиз, или стоит утянуть trunk ?



Офлайн

#6 Авг. 3, 2007 17:17:40

Андрей Светлов
От:
Зарегистрирован: 2007-05-15
Сообщения: 3137
Репутация: +  14  -
Профиль   Адрес электронной почты  

sqlalchemy close connection

Не важно.
Я trunk использую - нет проблем.
Сейчас в trunk 4.0 лежит.
Но разницы особой нет (в смысле безбаговости).



Офлайн

#7 Сен. 8, 2008 12:08:42

axe
От:
Зарегистрирован: 2008-08-07
Сообщения: 256
Репутация: +  0  -
Профиль   Отправить e-mail  

sqlalchemy close connection

Андрей Светлов
engine использует ConnectionPool. Т.е. создает несколько connections и использует их. 5 штук по умолчанию.
у меня похожая ситуация: постоянно открывается несколько соединений, потом старые закрываются, а новые создаются. и их не 5 а от 1 до 20

когда соединения создаются как в этом примере: http://www.modpython.org/FAQ/faqw.py?req=show&file=faq03.003.htp
то там будет ровно 10 открытых (постоянных) соединений, новые создаваться не будут

т.е. постоянно будут использоваться только эти и ровно 10 соединений
хотелось бы, чтоб create_engine работал точно так же.



Офлайн

#8 Сен. 8, 2008 13:35:32

Андрей Светлов
От:
Зарегистрирован: 2007-05-15
Сообщения: 3137
Репутация: +  14  -
Профиль   Адрес электронной почты  

sqlalchemy close connection

Можно унаследоваться от Pool и сделать свою реализацию - ровно на 10 connections



Офлайн

#9 Сен. 8, 2008 14:38:47

axe
От:
Зарегистрирован: 2008-08-07
Сообщения: 256
Репутация: +  0  -
Профиль   Отправить e-mail  

sqlalchemy close connection

унаследоваться от Pool - это указать параметры pool или poolclass для create_engine?

запускал указанные примеры из-под mod_python:

result = engine.execute("select username from users")
for row in result:
print "username:", row['username']
result.close()
соединение остаётся маячить в базе

connection = engine.connect()
result = connection.execute("select username from users")
for row in result:
print "username:", row['username']
connection.close()
а в этом варианте получается два соединения с базой.



Отредактировано (Сен. 9, 2008 16:56:25)

Офлайн

Board footer

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

Powered by DjangoBB

Lo-Fi Version