Модераторы: Daevaorn

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Как работают с базами данных в Python? wxPython, MySQL 
V
    Опции темы
Дмитрий Т
Дата 24.6.2006, 09:44 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 93
Регистрация: 16.3.2005
Где: Самара

Репутация: нет
Всего: 4



Пролистав пару книг по питону у меня сложилось впечатление, 
что с базами данных его удобно использовать только если писать для www, 
а вот создать для баз данных красивое GUI приложение под windows или linux 
будет нетривиальной задачей (хотел показывать через wxPython). 
Надо будет вручную раскладывать информацию, получаемую из базы, 
в визуальные компоненты...

Существуют ли какие-нибудь компоненты позволяющие быстро создавать 
пользовательский интерфейс для работы с sql базами данных? 
В первую очередь интересует MySQL.
Хочется систему компонентов аналогичную имеющейся в Borland Delphi и C++ Builder.
Есть что-нибудь близкое или как вообще решают такую задачу? 
PM MAIL WWW ICQ Skype   Вверх
pythonwin
Дата 24.6.2006, 11:34 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Участник
Сообщений: 2529
Регистрация: 18.4.2006
Где: за компом

Репутация: 14
Всего: 36



Это можно: SQLObject+wxPython 
PM WWW GTalk Jabber   Вверх
J2A
Дата 25.6.2006, 07:08 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


Профиль
Группа: Участник
Сообщений: 171
Регистрация: 17.11.2005
Где: Омск

Репутация: 16
Всего: 18



Напр. в PyQt3 есть модуль qtsql. Насчет PyQt4 не в курсе. 
--------------------
Be easy, stay cool
PM MAIL WWW Jabber   Вверх
Дмитрий Т
Дата 26.6.2006, 20:23 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 93
Регистрация: 16.3.2005
Где: Самара

Репутация: нет
Всего: 4



Цитата(pythonwin @ 24.6.2006,  12:34)
Это можно: SQLObject+wxPython

Если правильно понял, то полученные данные сами собой на экране не будут обновлятся. Так? 
PM MAIL WWW ICQ Skype   Вверх
slav0nic
Дата 27.6.2006, 16:09 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 129
Регистрация: 17.5.2006

Репутация: 4
Всего: 5



Дмитрий Т, в каком плане? как напишете так и будет работать)
идите дочитывайте книги %) 
--------------------
                                 python.com.ua 
PM MAIL WWW Jabber   Вверх
Дмитрий Т
Дата 27.6.2006, 18:10 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 93
Регистрация: 16.3.2005
Где: Самара

Репутация: нет
Всего: 4



Цитата(slav0nic @ 27.6.2006,  17:09)
Дмитрий Т, в каком плане? как напишете так и будет работать)
идите дочитывайте книги %)

Если бы вы попробовали Borland Delphi или их C++ Builder для работы с MySQL, Oracle, firebird и т.п., 
то сразу бы поняли о чём речь smile
Чтоб заработал не сложный, но и не совсем бестолковый пример в них достаточно написать SQL и 
больше никакого программирования! Притом без потерь качества, 
просто за счёт проработанной системы компонентов ориентированных на БД.
Но мне хочется более удобной кросплатформенности, а их kylix это что-то... 
PM MAIL WWW ICQ Skype   Вверх
J2A
Дата 28.6.2006, 05:45 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


Профиль
Группа: Участник
Сообщений: 171
Регистрация: 17.11.2005
Где: Омск

Репутация: 16
Всего: 18



Дмитрий Т, в wx такого нет. В Qt есть. Если не привязан к wx, делай на Qt; если привязан -- таки да, в ручную. 
--------------------
Be easy, stay cool
PM MAIL WWW Jabber   Вверх
diam
Дата 28.6.2006, 20:58 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 348
Регистрация: 23.1.2005
Где: Екатеринбург

Репутация: 3
Всего: 16



Гхм... Работа с СУБД никак не связана с интерфейсом, будь то GUI или нечто, рисующее веб-морду.

Если нужен пример работы с какой-либо БД, можно посмотреть на pyPgSQL, имплементирующая DB API2.0 для PostgreSQL (потому как недавно с ней работал smile ).

Вот пример работы:
Код

from pyPgSQL import PgSQL

pgconn = PgSQL.connect(host = 'dbhost', database = 'dbname', user = 'dbuser', password = 'dbpassword')
pgcurs = pgconn.cursor()

pgcurs.execute("SELECT * FROM my_lovean_table")
allrows = pgcurs.fetchall()

pgconn.commit()
pgconn.close()

# наш результат
print allrows
 
PM MAIL   Вверх
Дмитрий Т
Дата 29.6.2006, 05:25 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 93
Регистрация: 16.3.2005
Где: Самара

Репутация: нет
Всего: 4



Цитата(diam @ 28.6.2006,  21:58)
Гхм... Работа с СУБД никак не связана с интерфейсом, будь то GUI или нечто, рисующее веб-морду.

Э-э, дружище не скажите...
Разница не малая между "GUI или нечто, рисующее веб-морду".
Вам нужно увидеть программу-картотеку, допустим книг, с базой на миллион записей...
GUI таблица (сетка), к примеру, должна позволять перемещаться по базе, сортировать и редактировать, 
но при этом не загружать весь миллион в память. И это не единственная особенность. 
PM MAIL WWW ICQ Skype   Вверх
diam
Дата 29.6.2006, 07:50 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 348
Регистрация: 23.1.2005
Где: Екатеринбург

Репутация: 3
Всего: 16



Работа с СУБД заключается в следующем:
1. Построение запроса.
2. Выполнение запроса.
3(опционально). Получение результатов запроса.

Выполнение этих трёх процедур специфично для разных задач, и это естественно.
Цитата(Дмитрий Т @  29.6.2006,  08:25 Найти цитируемый пост)

GUI таблица (сетка), к примеру, должна позволять перемещаться по базе, сортировать и редактировать, 
но при этом не загружать весь миллион в память.

Поэтому то, о чём Вы говорите, является спецификой работы приложения с БД.

Вы можете испечь удобный для специфичной задачи API, и пользоваться им. И это будет правильно. Для GUI будет свой API, для web-морды - свой, для скриптов, обслуживающих распределённую СУБД,- свой, и т.д. Приложение-приложению рознь (с точки зрения удобства работы с БД). Именно поэтому, работа с СУБД зависит не от GUI/не GUI, а от задачи.

Добавлено @ 07:56 
Я предпочитаю использовать интерфейсы, основанные в свою очередь на интерфейсах, имплементирующих Python Database API Specification v2.0. А уж как "укутать" эти интерфейсы в удобную для задачи API - третье дело smile
PM MAIL   Вверх
pythonwin
Дата 29.6.2006, 10:53 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Участник
Сообщений: 2529
Регистрация: 18.4.2006
Где: за компом

Репутация: 14
Всего: 36



предлагаю использовать - SQLObject+wxPython. при этом не придется писать код подобный
Цитата(diam @  29.6.2006,  03:58 Найти цитируемый пост)
"SELECT * FROM my_lovean_table"
. Аналог 
Код

имя_таблицы.select()

надеюсь раздница чувствуется  smile  
PM WWW GTalk Jabber   Вверх
Дмитрий Т
Дата 29.6.2006, 15:14 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 93
Регистрация: 16.3.2005
Где: Самара

Репутация: нет
Всего: 4



Цитата(diam @ 29.6.2006,  08:50)
Цитата(Дмитрий Т @  29.6.2006,  08:25 Найти цитируемый пост)

GUI таблица (сетка), к примеру, должна позволять перемещаться по базе, сортировать и редактировать, 
но при этом не загружать весь миллион в память.

Поэтому то, о чём Вы говорите, является спецификой работы приложения с БД.

Не спорю, как раз и хотел узнать, а есть ли наработки в питоне на мою специфику.
Насколько понял - только в qt, но меня отталкивает их политика с лицензиями. 
PM MAIL WWW ICQ Skype   Вверх
Berliner
Дата 29.6.2006, 17:27 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 803
Регистрация: 18.5.2005

Репутация: нет
Всего: 2



Мне бы хотелось увидеть пример подключения к базе Syabse ASA  5.0.5 или ASE 12.0 и выборки данных
через ODBC пожалуста напишите пример плиз  
PM   Вверх
diam
Дата 29.6.2006, 21:57 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 348
Регистрация: 23.1.2005
Где: Екатеринбург

Репутация: 3
Всего: 16



Цитата(pythonwin @  29.6.2006,  13:53 Найти цитируемый пост)
надеюсь раздница чувствуется  smile   


pythonwin, тогда разберём несколько примеров, что бы сразу же всё было ясно smile. Если не против, разберём примеры с СУБД PostgreSQL. Можно с Oracle. (MySQL не предлагать smile ).
Примеры сильно утрирую. Дабы было понятнее. В реальной жизни структура несколько сложнее smile.

Пример 1.

Есть три таблицы.
Код

-- Таблица 1: справочник валют
--
-- id   - идентификатор валюты
-- name - наименование валюты
CREATE TABLE currencies
  (
    id SERIAL primary key,
    name TEXT not null unique
  );

-- Таблица 2: состояния операций с валютами
--
-- id    - ключ
-- fd    - момент времени, начиная с которого состояние
--         проведения операций вступает в силу
-- state - состояние проведения операций:
--           1 - операции проводятся
--           2 - операции заблокированы
CREATE TABLE currencystates
  (
    id BIGSERIAL primary key,
    fd TIMESTAMP not null default CURRENT_TIMESTAMP,
    state INTEGER not null CHECK(state IN (1, 2))
  );

-- Таблица 3: курсы валют по отношению к рублю
-- (стоимость валюты в валюте N1 - рублях)
--
-- id   - ключ
-- fd   - момент времени, начиная с которого заданный курс
--        вступает в силу
-- rate - новый курс
CREATE TABLE currencyrates
  (
    id BIGSERIAL primary key,
    fd TIMESTAMP not null default CURRENT_TIMESTAMP,
    rate DOUBLE PRECISION not null
  );

Если что-то непонятно в структуре таблиц (в логике), спрашивайте, объясню.

Задача.
Предоставить информацию в виде таблицы (наименование валюты, курс) на момент времени t1 ('01.04.2006 02:30:00'), отсортированную по наименованию валюты, при этом выбирать только ту валюту, операции с которой на момент времени t1 были разрешены.

Прошу предоставить решение, использующее:
Цитата(pythonwin @  29.6.2006,  13:53 Найти цитируемый пост)
предлагаю использовать - SQLObject+wxPython


Своё решение покажу позже.    

Это сообщение отредактировал(а) diam - 29.6.2006, 22:10
PM MAIL   Вверх
Berliner
Дата 3.7.2006, 14:14 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 803
Регистрация: 18.5.2005

Репутация: нет
Всего: 2



Хотелось бы решение  smile  
PM   Вверх
diam
Дата 3.7.2006, 18:24 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 348
Регистрация: 23.1.2005
Где: Екатеринбург

Репутация: 3
Всего: 16



Сначала ждёмс решения от pythonwin, использующее:
Цитата(pythonwin @  29.6.2006,  13:53 Найти цитируемый пост)
предлагаю использовать - SQLObject+wxPython

smile 
PM MAIL   Вверх
dvska
Дата 5.7.2006, 17:50 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


Профиль
Группа: Участник
Сообщений: 182
Регистрация: 30.1.2006

Репутация: 6
Всего: 9



Цитата(Berliner @ 29.6.2006,  17:27)
Мне бы хотелось увидеть пример подключения к базе Syabse ASA  5.0.5 или ASE 12.0 и выборки данных
через ODBC пожалуста напишите пример плиз

Код

# -*- coding: windows-1251 -*-
import mx.ODBC.Windows as odbc

conn = odbc.connect(YOUR_SYBASE_ODBC_DB_NAME, YOUR_SYBASE_DB_USER_ID, YOUR_SYBASE_DB_USER_PASSWORD) 
cur = conn.cursor()
cur.execute('Select col1, col2 from YourTable')
data=cur.fetchall()
 
--------------------
PM MAIL   Вверх
pythonwin
Дата 13.7.2006, 13:41 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Участник
Сообщений: 2529
Регистрация: 18.4.2006
Где: за компом

Репутация: 14
Всего: 36



Уважаемый ,diam, - специально для Вас!

создаем БД
Код

createdb -E=UNICODE fvtest --username=postgres


Запускаем код
Код

from sqlobject import *
from datetime import datetime
connection_string = "postgres://postgres:1234567@localhost:5432/fvtest"
connection = connectionForURI(connection_string)
sqlhub.processConnection = connection

class Currencies(SQLObject):
    class sqlmeta:
        table ='currencies'
    name = UnicodeCol(unique=True,notNone=True) 
     

class Currencystates(SQLObject): 
    class sqlmeta:
        table ='currencystates' 
    state = EnumCol(enumValues=['1','2'],default="1") 
    fd = DateTimeCol(default=datetime.now,notNone=True) 
     
     
class Currencyrates(SQLObject): 
    class sqlmeta: 
        table ='currencyrates' 
    fd = DateTimeCol(default=datetime.now,notNone=True) 
    rate = CurrencyCol(notNone=True)
Currencies.createTable()
Currencystates.createTable()
Currencyrates.createTable()


Добавлено @ 13:43 
PS. Пример для PostgreSQL 
PM WWW GTalk Jabber   Вверх
pythonwin
  Дата 13.7.2006, 14:20 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Участник
Сообщений: 2529
Регистрация: 18.4.2006
Где: за компом

Репутация: 14
Всего: 36



Вот ещё (правда не моё, но бесплатное)  -   

Присоединённый файл ( Кол-во скачиваний: 15 )
Присоединённый файл  DobbyV1.0.rar 11,03 Kb
PM WWW GTalk Jabber   Вверх
diam
Дата 13.7.2006, 23:33 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 348
Регистрация: 23.1.2005
Где: Екатеринбург

Репутация: 3
Всего: 16



smile .create()
pythonwin, можно на ты? На форуме дружественная обстановка, и мы вроде как не ненавидим друг друга. Поэтому зачем такие слова: "Уважаемый ,diam, - специально для Вас!". Даже обидно немного.
smile .close()

pythonwin, погоди, ты не до конца доделал smile. Ты просто создал таблички. А задача-то вот она:
Цитата

Задача.
Предоставить информацию в виде таблицы (наименование валюты, курс) на момент времени t1 ('01.04.2006 02:30:00'), отсортированную по наименованию валюты, при этом выбирать только ту валюту, операции с которой на момент времени t1 были разрешены.


Напиши решение, я позже прокомментирую. 
PM MAIL   Вверх
pythonwin
Дата 14.7.2006, 07:11 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Участник
Сообщений: 2529
Регистрация: 18.4.2006
Где: за компом

Репутация: 14
Всего: 36



Цитата(diam @  14.7.2006,  06:33 Найти цитируемый пост)
можно на ты

Можно и на ты  smile  
PM WWW GTalk Jabber   Вверх
pythonwin
Дата 14.7.2006, 07:55 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Участник
Сообщений: 2529
Регистрация: 18.4.2006
Где: за компом

Репутация: 14
Всего: 36



diam, посмотри http://python.org/pypi/PythonCard/0.8.1 - рисуется довольно легко. советую PythonCard 0.8.2
 
PM WWW GTalk Jabber   Вверх
pythonwin
Дата 14.7.2006, 11:33 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Участник
Сообщений: 2529
Регистрация: 18.4.2006
Где: за компом

Репутация: 14
Всего: 36



пример использования таблицы можно посмотреть здесь

немного поправил, чтобы тебе, diam, было легче:

Код

from wxPython.wx import *
from   wxPython.grid import *
from   wxPython.lib.mixins.grid import wxGridAutoEditMixin
import sys, os

ID_ABOUT  = 102
ID_HELP   = 103
ID_EXIT   = 104
ID_VIEW   = 105
ID_OPEND  = 107
ID_OPENS  = 101
ID_SETUP  = 108
ID_OUTPUT = 106
ID_TEST_BUTTON = 109

class DataGrid(wxGrid):
    def __init__(self, parent):
        wxGrid.__init__(self, parent, -1)
        self.wxPostion=(50,50)
        self.moveTo = None

        self.CreateGrid(25, 25)
        self.SetCellValue(6, 0, "123.34")

        attr = wxGridCellAttr()
        attr.SetTextColour(wxBLACK)
        attr.SetBackgroundColour(wxRED)
        attr.SetFont(wxFont(10, wxSWISS, wxNORMAL, wxBOLD))

        self.SetColLabelAlignment(wxALIGN_LEFT, wxALIGN_BOTTOM)

class MyParentFrame(wxMDIParentFrame):
     def __init__(self):
         wxMDIParentFrame.__init__(self, None, -1, "My App")

         self.CreateStatusBar()
         self.SetStatusText("This is the statusbar")

         tb = wxToolBar(self,-1)
         tb.AddControl(wxButton(tb, ID_TEST_BUTTON, 
"Button",wxDefaultPosition, wxDefaultSize))
         tb.Realize()

         FileMenu = wxMenu()
         FileMenu.Append(ID_OPENS, "Open S&etup File", "Open a setup file for use in this session")
         FileMenu.Append(ID_OPEND, "Open D&ata File", "Open a data file fo ruse in this session")
         FileMenu.Append(ID_EXIT, "E&xit", "Terminate the program")

         ViewMenu = wxMenu()
         ViewMenu.Append(ID_SETUP, "S&etup", "View the current setup file")
         ViewMenu.Append(ID_OUTPUT, "O&utput", "View the current output file")

         HelpMenu = wxMenu()
         HelpMenu.Append(ID_HELP, "H&elp", "More information about this program")
         HelpMenu.Append(ID_ABOUT, "A&bout", "More information about this program")

         menuBar = wxMenuBar()
         menuBar.Append(FileMenu, "&File")
         menuBar.Append(ViewMenu, "&View")
         menuBar.Append(HelpMenu, "&Help")

         self.SetMenuBar(menuBar)

         EVT_MENU(self, ID_ABOUT, self.OnAbout)
         EVT_MENU(self, ID_EXIT,  self.TimeToQuit)
         EVT_MENU(self, ID_OPEND, self.OpenDataFile)

         DataChildFrame=wxMDIChildFrame(self, -1, "Data View")
         DataChildFrame.Show(true)

         dg = DataGrid(DataChildFrame)

     def OnAbout(self, event):
         dlg = wxMessageDialog(self, "This sample program shows off\n"
                               "frames, menus, statusbars, and this\n"
                              "message dialog.",
                               "About Me", wxOK | wxICON_INFORMATION)
         dlg.ShowModal()
         dlg.Destroy()

     def test():
         pass

     def TimeToQuit(self, event):
         self.Close(true)

     def OpenDataFile(self, event):
         pass

class MyApp(wxApp):
     def OnInit(self):
         frame = MyParentFrame()
         frame.Show(true)
         self.SetTopWindow(frame)
         return true

app = MyApp(0)
app.MainLoop()

 
PM WWW GTalk Jabber   Вверх
pythonwin
Дата 14.7.2006, 11:51 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Участник
Сообщений: 2529
Регистрация: 18.4.2006
Где: за компом

Репутация: 14
Всего: 36



diam, а вот и SELECT
Код

##t1 ('01.04.2006 02:30:00')
Currencies.get(id).select(orderBy=Currencies.q.name)


Цитата

Задача.
Предоставить информацию в виде таблицы (наименование валюты, курс) на момент времени t1 ('01.04.2006 02:30:00'), отсортированную по наименованию валюты, при этом выбирать только ту валюту, операции с которой на момент времени t1 были разрешены.

Вот эту часть задания плохо понял, - пожалуйста, diam, привети пример в SQL.
 
PM WWW GTalk Jabber   Вверх
pythonwin
Дата 14.7.2006, 12:30 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Участник
Сообщений: 2529
Регистрация: 18.4.2006
Где: за компом

Репутация: 14
Всего: 36



Вот ещё пример:
Код

from wxPython.wx import *
from wxPython.grid import *

class CustomCellChoiceEditor(wxPyGridCellEditor):
    def __init__(self, varDefDict, editable):
        wxPyGridCellEditor.__init__(self)
        self._varDefDict = varDefDict
        self._editable = editable

    def Create(self, parent, id, evtHandler):
        """
        Called to create the control, which must derive from wxControl.
        """
        self._tc = wxChoice(parent, id, choices = self._varDefDict.values())
        if len(self._varDefDict.keys()):
            self._tc.SetSelection(0)
        self.SetControl(self._tc)
        if evtHandler:
            self._tc.PushEventHandler(evtHandler)


    def SetSize(self, rect):
        """
        Called to position/size the edit control within the cell rectangle.
        If you don't fill the cell (the rect) then be sure to override
        PaintBackground and do something meaningful there.
        """
        self._tc.SetDimensions(rect.x, rect.y, rect.width+4, rect.height+4,
                               wxSIZE_ALLOW_MINUS_ONE)


    def BeginEdit(self, row, col, grid):
        """
        Fetch the value from the table and prepare the edit control
        to begin editing.  Set the focus to the edit control.
        """
        self.startValue = grid.GetTable().GetValue(row, col)
        self._tc.SetStringSelection(self._varDefDict[self.startValue])
        self._tc.SetFocus()


    def EndEdit(self, row, col, grid):
        """
        Complete the editing of the current cell. Returns true if the value
        has changed.  If necessary, the control may be destroyed.
        """
        changed = false

        pclDescr = self._tc.GetStringSelection()
        # extract pcl
        pcl = pclDescr.split('    ')[0]
        if pcl != self.startValue :
            changed = true
            grid.GetTable().SetValue(row, col, pcl) # update the table

        self.startValue = ''
        return changed


    def Reset(self):
        """
        Reset the value in the control back to its starting value.
        """
        self._tc.SetStringSelection(self._varDefDict[self.startValue])


    def Clone(self):
        """
        Create a new object which is the copy of this one
        """
        return CustomCellChoiceEditor(self._varDefDict, self._editable)

#---------------------------------------------------------------------------

class TestFrame(wxFrame):
    def __init__(self, parent):
        wxFrame.__init__(self, parent, -1, "Custom Grid Cell Editor Test",
                         size=(400,120))
        grid = wxGrid(self, 2001, size = wxSize(360, 80))
        grid.CreateGrid(2, 2)
        grid.SetColLabelValue(0, 'Col 1')
        grid.SetColLabelValue(1, 'Col 2')
        grid.SetColLabelAlignment(wxALIGN_CENTRE, wxALIGN_CENTRE)
        grid.SetColSize(1, 280)
        grid.SetRowLabelSize(0)
        grid.SetCellValue(1, 1, 'A')
        dict = {'A':'A    Description_of_A', 'B':'B    Description_of_B'}
        grid.SetCellEditor(1, 1, CustomCellChoiceEditor(dict, true))


#---------------------------------------------------------------------------

if __name__ == '__main__':
    import sys
    app = wxPySimpleApp()
    frame = TestFrame(None)
    frame.Show(true)
    app.MainLoop()
 
PM WWW GTalk Jabber   Вверх
J2A
Дата 14.7.2006, 16:21 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


Профиль
Группа: Участник
Сообщений: 171
Регистрация: 17.11.2005
Где: Омск

Репутация: 16
Всего: 18



pythonwin, ты в wx используешь устаревший синтаксис. Сейчас акутально разделять пространства имен, т.е. не
Код

from wxPython.wx import *
class MyWin(wxWindow):
    pass


а 
Код

import wx
class MyWin(wx.Window):
    pass
 
--------------------
Be easy, stay cool
PM MAIL WWW Jabber   Вверх
pythonwin
Дата 14.7.2006, 18:02 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Участник
Сообщений: 2529
Регистрация: 18.4.2006
Где: за компом

Репутация: 14
Всего: 36



А у меня новый ошибками ругается smile  
PM WWW GTalk Jabber   Вверх
Berliner
Дата 20.7.2006, 19:35 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 803
Регистрация: 18.5.2005

Репутация: нет
Всего: 2



Спасиб за код.

Код

# -*- coding: windows-1251 -*-
import mx.ODBC.Windows as odbc
conn = odbc.connect(YOUR_SYBASE_ODBC_DB_NAME, YOUR_SYBASE_DB_USER_ID, YOUR_SYBASE_DB_USER_PASSWORD) 
cur = conn.cursor()
cur.execute('Select col1, col2 from YourTable')
data=cur.fetchall()


выполнил вылазит ошибка -Подскажите пожалуста, че импорт не может сделать?


import mx.ODBC.Windows as odbc
ImportError: No module named mx.ODBC.Windows 
PM   Вверх
dvska
  Дата 20.7.2006, 20:44 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


Профиль
Группа: Участник
Сообщений: 182
Регистрация: 30.1.2006

Репутация: 6
Всего: 9



user posted image
Цитата(Berliner @  20.7.2006,  19:35 Найти цитируемый пост)
выполнил вылазит ошибка -Подскажите пожалуста, че импорт не может сделать?


import mx.ODBC.Windows as odbc
ImportError: No module named mx.ODBC.Windows  


Потому что в стандартной поставке питона нет модуля для работы с ODBC. Его надо скачать и поставить. Я использовал коммерческий модуль mxODBC - Python ODBC Interface. Можно также взять бесплатный вариант из поставки pyWin32 http://www.python.net/crew/mhammond/win32/Downloads.html . user posted image
  

Это сообщение отредактировал(а) dvska - 20.7.2006, 20:49
--------------------
PM MAIL   Вверх
pythonwin
Дата 21.7.2006, 07:19 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Участник
Сообщений: 2529
Регистрация: 18.4.2006
Где: за компом

Репутация: 14
Всего: 36



diam, пожалуйста, покажи решение... 
PM WWW GTalk Jabber   Вверх
Berliner
Дата 21.7.2006, 16:58 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 803
Регистрация: 18.5.2005

Репутация: нет
Всего: 2



Цитата

Можно также взять бесплатный вариант из поставки pyWin32 http://www.python.net/crew/mhammond/win32/Downloads.html 

спасиб, скачал exe файл. или  просто надо проинсталить? или что-то кудато подключать? 
PM   Вверх
pythonwin
Дата 21.7.2006, 17:15 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Участник
Сообщений: 2529
Регистрация: 18.4.2006
Где: за компом

Репутация: 14
Всего: 36



Цитата(Berliner @  21.7.2006,  23:58 Найти цитируемый пост)
спасиб, скачал exe файл. или  просто надо проинсталить? или что-то кудато подключать?  


Инсталировать. 
PM WWW GTalk Jabber   Вверх
Berliner
Дата 21.7.2006, 20:47 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 803
Регистрация: 18.5.2005

Репутация: нет
Всего: 2



Заинсталил и пишет не найдена imort.ODBC......... Может по другому надо подключить библиотеку? В хелпе примеров по подключению библиотеки не нашел.  

Это сообщение отредактировал(а) Berliner - 21.7.2006, 20:48
PM   Вверх
diam
Дата 22.7.2006, 00:10 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 348
Регистрация: 23.1.2005
Где: Екатеринбург

Репутация: 3
Всего: 16



Господа, прошу меня извинить. Я неправильно описал структуру таблиц, во второй и третьей таблице не хватает одного поля, которое увяжет каждую из них с первой таблицей. Поэтому структура такова:
Код

-- Таблица 1: справочник валют
--
-- id   - идентификатор валюты
-- name - наименование валюты
CREATE TABLE currencies
  (
    id SERIAL primary key,
    name TEXT not null unique
  );

-- Таблица 2: состояния операций с валютами
--
-- id            - ключ
-- currencies_id - идентификатор валюты
-- fd            - момент времени, начиная с которого состояние
--                 проведения операций вступает в силу
-- state         - состояние проведения операций:
--                   1 - операции проводятся
--                   2 - операции заблокированы
CREATE TABLE currencystates
  (
    id BIGSERIAL primary key,
    currencies_id BIGINT references currencies(id),
    fd TIMESTAMP not null default CURRENT_TIMESTAMP,
    state INTEGER not null CHECK(state IN (1, 2))
  );

-- Таблица 3: курсы валют по отношению к рублю
-- (стоимость валюты в валюте N1 - рублях)
--
-- id            - ключ
-- currencies_id - идентификатор валюты
-- fd            - момент времени, начиная с которого заданный курс
--                 вступает в силу
-- rate          - новый курс
CREATE TABLE currencyrates
  (
    id BIGSERIAL primary key,
    currencies_id BIGINT references currencies(id),
    fd TIMESTAMP not null default CURRENT_TIMESTAMP,
    rate DOUBLE PRECISION not null
  );

Ещё раз прошу меня простить.

Теперь продолжим.

Цитата(diam @  30.6.2006,  00:57 Найти цитируемый пост)
Задача.
Предоставить информацию в виде таблицы (наименование валюты, курс) на момент времени t1 ('01.04.2006 02:30:00'), отсортированную по наименованию валюты, при этом выбирать только ту валюту, операции с которой на момент времени t1 были разрешены.

Решение.
Сразу же скажу, что я стараюсь отделять запросы SQL от кода, то есть запросы находятся в отдельном модуле и являются пронумерованными. Цель: отделить SQL-код от кода основной программы, тем самым упрощается просмотр кода основной программы, и устранять ошибки становится намного проще. Так, у большого приложения может быть много разных запросов (больше тысячи), но при этом нет никакого бардака. Поэтому у меня создано два файла: pgqueries.py и solution.py, в первом, соответственно, запросы, во втором - код, который забирает результаты из базы и выводит их.
pgqueries.py
Код

SQL_1 = """
-- Выбираем:
--   идентификатор валюты                                                       
--   наименование валюты                                                        
--   курс
-- Из таблиц:
--   справочник валют (a)                                                       
--   состояния валют  (b)                                                       
--   курсы валют      (c)                                                       
-- Где:
--     из всех строк в (b) и (c) рассматриваем только те,                       
--     которые относятся к рассматриваемой строке в (a)                         
--   и 
--     только ту строку в (b), которая относится к                              
--     моменту времени t1                                                       
--   и 
--     выбираем только ту строку из (b), где состояние                          
--     валюты активно (b.state = 1)                                             
--   и 
--     только ту строку в (c), которая относится к                              
--     моменту времени t1                                                       
SELECT
  a.id   AS currencies_id,                                                      
  a.name AS currency,                                                           
  c.rate AS rate                                                                
FROM
  currencies a,
  currencystates b,                                                             
  currencyrates c
WHERE a.id = b.currencies_id                                                    
  AND a.id = c.currencies_id                                                    
  AND b.fd =                                                                    
    (
      SELECT MAX(fd)
      FROM currencystates
      WHERE currencies_id = a.id
        AND fd <= to_timestamp('%(fd)s', 'DD.MM.YYYY HH24:MI:SS')               
    )
  AND b.state = 1
  AND a.id = b.currencies_id                                                    
  AND c.fd =                                                                    
    (
      SELECT MAX(fd)
      FROM currencyrates
      WHERE currencies_id = a.id
        AND fd <= to_timestamp('%(fd)s', 'DD.MM.YYYY HH24:MI:SS')               
    )
ORDER BY a.name
"""


solution.py
Код

from pgqueries import *
from pyPgSQL import PgSQL                                                       

pgconn = PgSQL.connect(host = 'dbhost',
        database = 'dbname', user = 'dbuser',password = 'dbpassword')           
pgcurs = pgconn.cursor()

fd = "01.04.2006 02:30:00"
pgcurs.execute(SQL_1 % {'fd': fd})
allrows = pgcurs.fetchall()

pgconn.commit()
pgconn.close()

print "id.Валюта: курс"

for row in allrows:
    currencies_id = row[0]
    currency      = row[1]                                                      
    rate          = row[2]

    print "%(id)d.%(currency)s: %(rate)s" % {                                   
            'id'       : currencies_id,                                         
            'currency' : currency,
            'rate'     : rate
        }


Сразу по ходу замечания: я не рассматриваю вопросы вывода полученного результата, не рассматриваю вопросы написания какого-нибудь API, поскольку какой-либо специфики нет по причине простоты задачи. А усложнить всегда успеем smile.
Код не коментирую по причине простоты и небольшого размера, немного прокоментировал лишь запрос.

Вопросы производительности. Ещё не тестировал, напишу позже. 
PM MAIL   Вверх
Berliner
Дата 24.7.2006, 10:53 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 803
Регистрация: 18.5.2005

Репутация: нет
Всего: 2



Заинсталил и пишет не найдена import.ODBC.Windows as odbc  Может по другому надо подключить библиотеку? В хелпе примеров по подключению библиотеки не нашел. Прописываю это в интерактивном модуле pythonWindows. Интересно что когда пишу import. (ставлю точку то подсвечивается подсказка ODBC)- значит, библиотека всетаки есть? А почему пишет что ее нет?   
PM   Вверх
pythonwin
Дата 24.7.2006, 13:00 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Участник
Сообщений: 2529
Регистрация: 18.4.2006
Где: за компом

Репутация: 14
Всего: 36



Berliner, пожалуйста, приведи пример кода. 
PM WWW GTalk Jabber   Вверх
Berliner
Дата 24.7.2006, 13:12 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 803
Регистрация: 18.5.2005

Репутация: нет
Всего: 2



Код

import mx.ODBC.Windows as odbc
 
PM   Вверх
pythonwin
Дата 24.7.2006, 13:33 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Участник
Сообщений: 2529
Регистрация: 18.4.2006
Где: за компом

Репутация: 14
Всего: 36



Цитата(Berliner @  24.7.2006,  20:12 Найти цитируемый пост)
Python
import mx.ODBC.Windows as odbc
  

У меня тоже ошибка. Ты откуда этот кусок кода взял? 
PM WWW GTalk Jabber   Вверх
dvska
Дата 24.7.2006, 15:32 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


Профиль
Группа: Участник
Сообщений: 182
Регистрация: 30.1.2006

Репутация: 6
Всего: 9



Цитата(Berliner @  24.7.2006,  10:53 Найти цитируемый пост)
Заинсталил и пишет не найдена import.ODBC.Windows as odbc  Может по другому надо подключить библиотеку? В хелпе примеров по подключению библиотеки не нашел. Прописываю это в интерактивном модуле pythonWindows. Интересно что когда пишу import. (ставлю точку то подсвечивается подсказка ODBC)- значит, библиотека всетаки есть? А почему пишет что ее нет?    

Я приводил пример для поставки MX, а не PythonWin;
тебе нужно просто 
Код

import odbc
 
--------------------
PM MAIL   Вверх
pythonwin
Дата 24.7.2006, 16:22 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Участник
Сообщений: 2529
Регистрация: 18.4.2006
Где: за компом

Репутация: 14
Всего: 36



dvska, у меня всё равно говорит, что нет такого модуля 
PM WWW GTalk Jabber   Вверх
diam
Дата 25.7.2006, 10:05 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 348
Регистрация: 23.1.2005
Где: Екатеринбург

Репутация: 3
Всего: 16



Кстати, pythonwin, напиши решение с SQLObject. Я его тоже на производительность потестю, потом результаты выложу. 
PM MAIL   Вверх
pythonwin
Дата 25.7.2006, 11:10 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Участник
Сообщений: 2529
Регистрация: 18.4.2006
Где: за компом

Репутация: 14
Всего: 36



Цитата(diam @  25.7.2006,  17:05 Найти цитируемый пост)
Кстати, pythonwin, напиши решение с SQLObject. Я его тоже на производительность потестю, потом результаты выложу.  


Хорошо... Но не сегодня - есть проблемы со временем. 
PM WWW GTalk Jabber   Вверх
cherep
Дата 26.7.2006, 21:19 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 74
Регистрация: 11.1.2006
Где: Москва

Репутация: 1
Всего: 4



Сам то я не видел  smile, но говорят, что вполне крут sqlalchemy

Добавлено @ 21:21 
упс.. запостил раньше времени

даже натыкался на обсуждения, там убеждают, что круче многократно, чем SQLObject. Сам утверждать не могу, т.к. не пробовал ни то ни другое...  но может стоит тоже глянуть  smile  
PM MAIL WWW ICQ   Вверх
pythonwin
Дата 27.7.2006, 07:01 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Участник
Сообщений: 2529
Регистрация: 18.4.2006
Где: за компом

Репутация: 14
Всего: 36



cherep, я тоже это слышал и читал про это, но сам sqlalchemy не использовал, и поэтому пока советую "старенький" SQLObject

Добавлено @ 07:07 
найду время - обязательно разберусь с sqlalchemy. 
PM WWW GTalk Jabber   Вверх
Berliner
Дата 31.7.2006, 15:20 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 803
Регистрация: 18.5.2005

Репутация: нет
Всего: 2



Цитата

import odbc

Спасиб -импорт делает.

Но далее
Код

conn = odbc.connect(YOUR_SYBASE_ODBC_DB_NAME, YOUR_SYBASE_DB_USER_ID, YOUR_SYBASE_DB_USER_PASSWORD) 
cur = conn.cursor()
cur.execute('Select col1, col2 from YourTable')
data=cur.fetchall()

вываливает ошибку. типа ненайден conn или отсутсвует метод. ругается на вторую строку- думаю что чарез pythonwin расшерение надо по другому прописывать коннект подскажите как сделать выборку из базы. В pythonwin документации ничего толкового не нашел. Подскажите плиз.  
PM   Вверх
dvska
Дата 31.7.2006, 15:58 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


Профиль
Группа: Участник
Сообщений: 182
Регистрация: 30.1.2006

Репутация: 6
Всего: 9



Berliner, в C:\python24\Lib\site-packages\PyWin32.chm всё есть 
--------------------
PM MAIL   Вверх
Berliner
Дата 1.8.2006, 11:03 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 803
Регистрация: 18.5.2005

Репутация: нет
Всего: 2



Хм там проство описаны свойства  odbc connect и другие. А примера нет. Мне по примерама лучше разбираться.
PM   Вверх
Ответ в темуСоздание новой темы Создание опроса
1 Пользователей читают эту тему (1 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | Python: Общие вопросы | Следующая тема »


 




[ Время генерации скрипта: 0.1748 ]   [ Использовано запросов: 21 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.