Форум программистов, компьютерный форум, киберфорум
Python: Базы данных
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.80/5: Рейтинг темы: голосов - 5, средняя оценка - 4.80
17 / 22 / 6
Регистрация: 16.10.2013
Сообщений: 316

MySQL транзакции и врапер, как организовать?

07.11.2014, 12:40. Показов 1417. Ответов 4
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
Захотелось поюзать транзакции, как оно работает все понятно но нужен совет как организовать в апликухе.
Есть врапер написаный на коленке для селкт/апдейт/пут/делит
В апликухе просто в конкретный метод передаю данные. И вот теперь как мне организовать транзакции? И где, в самом врапере или юзать mysqldb в нужных частях апликухи и уже там коммит или ролбэк
0
IT_Exp
Эксперт
34794 / 4073 / 2104
Регистрация: 17.06.2006
Сообщений: 32,602
Блог
07.11.2014, 12:40
Ответы с готовыми решениями:

Как создать представление в транзакции, MySQL?
вопрос в том что у меня есть код, задание- создать представление (виртуальную таблицу) в транзакции: START TRANSACTION; CREATE VIEW ...

Как сделать транзакции в mysql server?
В новой базе данных new_base создать таблицу счетов типа InnoDB (поле баланс действительного типа) : Rahunok ( number , balance ).Создать...

Транзакции,влияет ли количество изменяемых данных в рамках одной транзакции, как, на что и почему?
ууу

4
Z3JheSBoYXQ=
 Аватар для fanatdebian
342 / 237 / 83
Регистрация: 08.07.2012
Сообщений: 577
07.11.2014, 14:48
mysqldb это самый "нижний" слой, для языка, по работа с базой. Ты пишешь интерфейс к конкретному типу. Определяешь дефолтную базовую модель для всех последующих, имеющих общие для всех методы. Будущие таблицы, как пример.
Это один слой. Слой данных. В нем ты реализуешь все методы, декораторы по транзакциям с базой данных.

Следующий слой слой обработки. Прослойка, которая просто пользует результаты операций первого слоя. Методам этого слоя плевать как там реализовано "внизу" она хавает результат.

Следующий слой - слой представление данных конечному юзверю. Тут всякие темплейты, шаблоны.

---
пример, запрос к первому слою о количестве пользователей в базе данных.
ответ на второй слой, анализ и выбор варианта представления данных. Если пользователей 0, то сообщаем об отсутствии таковых, если больше 0 то сообщаем этот факт.

Это простая схема, но в большинстве случаев так и работают web связки, построенных на MVC шаблонах проектирования.

А вообще загляни в код любой orm ( sqlalchemy, peewee ) там все наглядно и просто и так. Сразу поймешь.
1
17 / 22 / 6
Регистрация: 16.10.2013
Сообщений: 316
07.11.2014, 22:11  [ТС]
да если честно . то весь день гугл шуршал но так и не понял как организовать. В тупую выполнить несколько запросов и потом выполнить коммит или ролбек это я сделал... все екзепшены и условия.
Не могли бы Вы какой-то пример как для идиота привести?
напрмер мне нужно реализовать следующее
- добавление ордера в БД
- далее беру номер ордера генерирую хеш, добавляю к в словарь с данными ордера (выходит в словаре + айди ордера и хеш)
- далее шлю эту муть на сервер, на серваке сверяю все если проканало верну Тру если нет Фолс
-далее в апликухе если пришел фолс то Ролбэк если Тру - коммит.

Как это организовать если юзать враппер. У меня все методы для работы с бд вынесены в него и после каждого запроса на добавление или апдейт идет коммит. + в врапере обрабатываю исключения.
0
Z3JheSBoYXQ=
 Аватар для fanatdebian
342 / 237 / 83
Регистрация: 08.07.2012
Сообщений: 577
08.11.2014, 00:18
Накидал тут пример сессии, для понимания самое то.
Python
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
#!/usr/local/bin/python
# coding: utf-8
__author__ = 'spouk'
 
# да если честно . то весь день гугл шуршал но так и не понял как организовать. В тупую выполнить несколько запросов и потом выполнить коммит или ролбек это я сделал... все екзепшены и условия.
# Не могли бы Вы какой-то пример как для идиота привести?
# напрмер мне нужно реализовать следующее
# - добавление ордера в БД
# - далее беру номер ордера генерирую хеш, добавляю к в словарь с данными ордера (выходит в словаре + айди ордера и хеш)
# - далее шлю эту муть на сервер, на серваке сверяю все если проканало верну Тру если нет Фолс
# -далее в апликухе если пришел фолс то Ролбэк если Тру - коммит.
#
# Как это организовать если юзать враппер. У меня все методы для работы с бд вынесены в него и после каждого запроса на добавление или апдейт идет коммит. + в врапере обрабатываю исключения.
#
 
#  peewee - ORM ( враппер ) - для базы данных
#  flask - http-сервер в данном случае, для примера сессий
 
from flask import Flask, redirect, request, url_for, render_template, session
from peewee import MySQLDatabase, Model, PrimaryKeyField, TextField, DateTimeField, BooleanField, IntegerField
from datetime import datetime
from hashlib import md5
from wtforms import Form, StringField
from wtforms.validators import DataRequired
 
app=Flask(__name__)
 
app.secret_key ='simple secretkey'
 
#  определение секции для работы с базой данных
 
db = MySQLDatabase(
    database='test',
    threadlocals=True,
    autocommit=True,
    autorollback=False,
    user='user',
    passwd='user',
)
 
class Core(Model):
    class Meta:
        database = db
 
class OrderTable(Core):
    """ таблица с заказами """
    id = PrimaryKeyField()
    name_order = TextField()
    price = IntegerField(default=0)
    hash_order = TextField(default=None)
    count_order = IntegerField(default=0)
    create_time = DateTimeField(default=datetime.today())
 
    @classmethod
    def order_add_new(cls, name_order, price, count_order):
        """ добавляем новый заказик """
        new_order = OrderTable(
            name_order = name_order,
            price = price,
            hash_order = md5(name_order).hexdigest(),
            count_order = count_order,
        )
        new_order.save()
        return True
 
    @classmethod
    def order_check_exists(cls, name_order=None, order_id=None, hash_order=None):
        """проверка наличия такого заказа"""
        if name_order:
            return OrderTable.select().where(OrderTable.name_order == name_order).first()
        if hash_order:
            return OrderTable.select().where(OrderTable.hash_order == hash_order).first()
        if order_id:
            return OrderTable.select().where(OrderTable.id == order_id).first()
        return False
 
 
list_table = [Core, OrderTable]
 
def make_table(list_table):
    try:
        db.connect()
        db.create_tables(list_table)
    except:
        pass
 
make_table(list_table)
 
#  секция определения форм
#  по валидации, обработчики как правило пишутся тут, однако я для простоты и лучшего понимания оставил
# дефолтные общие, самый минимум
 
class OrderForm(Form):
    order_id = StringField(u'Номер заказа')
    name_order = StringField(u'Имя заказа')
 
class AddOrder(Form):
    name_order = StringField(u'Имя заказа', validators=[DataRequired()])
    price = StringField(u'Цена заказа', validators=[DataRequired()])
    count_order = StringField(u'Количество', validators=[DataRequired()])
 
 
#  секция обработчиков реквестов
@app.before_request
def reconnect():
    db.connect()
 
 
@app.route('/', methods=['GET'])
def root_get():
    form = OrderForm(request.form)
    return render_template('order.html',
                           form=form)
 
@app.route('/', methods=['POST'])
def root_post():
    form = OrderForm(request.form)
    if form.validate():
        order = OrderTable.order_check_exists(name_order=form.name_order.data)
        if order:
            print 'Bingo ==>', order.id, order.name_order, order.create_time
        else:
            print '--> Order not created <--'
    return redirect(url_for('root_get'))
 
@app.route('/add_order', methods=['GET'])
def root_order_add():
    form = AddOrder(request.form)
    return render_template('add_order.html',
                           form=form)
 
@app.route('/add_order', methods=['POST'])
def root_order_add_post():
    form = AddOrder(request.form)
    if form.validate():
        order = OrderTable.order_add_new(
            name_order=form.name_order.data,
            price=int(form.price.data),
            count_order=int(form.count_order.data),
        )
        if order:
            print '--> New order creating <--'
        else:
            print ' Found some errors in during make new order '
 
    return redirect(url_for('root_order_add'))
 
app.run(
    host='0.0.0.0',
    port=20000,
    debug=True
)
файлы html поместить в директорию templates
add_order.html
HTML5
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
<!DOCTYPE html>
<html>
<head lang="en">
    <meta charset="UTF-8">
    <title></title>
</head>
<body>
 
<form action="{{url_for('root_order_add_post') }}" method="post">
    <fieldset>
        <legend>Cоздание нового заказа</legend>
 
        {{form.name_order.label}} {{form.name_order}}
        {{form.price.label}} {{form.price}}
        {{form.count_order.label}} {{form.count_order}}
        <input type="submit" name="send_order" value="Отправить ордер" />
 
    </fieldset>
</form>
 
</body>
</html>
order.html
----------------
HTML5
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
<!DOCTYPE html>
<html>
<head lang="en">
    <meta charset="UTF-8">
    <title></title>
</head>
<body>
 
 
<form action="{{url_for('root_post') }}" method="post">
    <fieldset>
        <legend>Проверка и создание нового заказа</legend>
 
        {{form.order_id.label}} {{form.order_id}}
        {{form.name_order.label}} {{form.name_order}}
        <input type="submit" name="send_order" value="Отправить ордер" />
 
    </fieldset>
</form>
<a href="/add_order">Создать новый заказ</a>
 
</body>
</html>
Bash
1
2
3
4
 * Restarting with reloader
Bingo ==> 1 simple 2014-11-07 23:05:12
127.0.0.1 - - [07/Nov/2014 23:08:06] "POST / HTTP/1.1" 302 -
127.0.0.1 - - [07/Nov/2014 23:08:06] "GET / HTTP/1.1" 200 -
Bash
1
2
3
4
5
6
7
8
9
10
11
12
13
14
ERROR 2006 (HY000): MySQL server has gone away
No connection. Trying to reconnect...
Connection id:    1871
Current database: test
 
+----+------------+-------+----------------------------------+-------------+---------------------+
| id | name_order | price | hash_order                       | count_order | create_time         |
+----+------------+-------+----------------------------------+-------------+---------------------+
|  1 | simple     |    10 | 8dbdda48fb8748d6746f1965824e966a |         100 | 2014-11-07 23:05:12 |
|  2 | simple2    |    20 | 634b863c6c1cf8c3eb479281892a6d03 |          10 | 2014-11-07 23:05:12 |
+----+------------+-------+----------------------------------+-------------+---------------------+
2 rows in set (0.00 sec)
 
spouk@localhost [test]>
Добавлено через 6 минут
Писать с "нуля" можно к примеру форум, смс, движок какой. Враппер можно писать с нуля, только если есть действительно веская причина для этого. Для лучшего понимания рекомендую, просто поработать с любой доступной ОРМ sqlalchemy или peewee. Поковырять код, там все ясно и понятно. Причем они очень хороши, как в плане кода, так и в плане функциональности и поддержки самых последних фишек поддерживаемых типов баз данных.

Пользуй инструменты, благо они отличные. Успехов.
1
17 / 22 / 6
Регистрация: 16.10.2013
Сообщений: 316
10.11.2014, 12:02  [ТС]
Спасибо за столь огромный пример! Не думал, что на форуме вообще кто то столько написать не поленится. Обязательно разберу как доберусь до компа. А орм конечно круто но мне бы БД выучить, так все запросы пишу сам и разбираюсь по чуть чуть.

Добавлено через 23 часа 9 минут
честно говоря так и не увидел какорганизовать транзакции. А переписівать весь проект под ОРМ нет желания. Есть уже кое как работающий сайтег, и все что надо использовать транзакции. И есть враппер для работы с бд. Как понимаю через врапер не организовать...
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
BasicMan
Эксперт
29316 / 5623 / 2384
Регистрация: 17.02.2009
Сообщений: 30,364
Блог
10.11.2014, 12:02
Помогаю со студенческими работами здесь

Транзакции MySql
есть код считающий кол-во остатков, проблема при обращении с нескольких клиентов не учитывается INSERT который был выполнен до SELECT в...

Транзакции MySQL
На виндовсе не работают транзакции, хотя под линуксом тот же код работает нормально. Куда копать? Qt 5,8 и 5,7. Проверяю транзакции через...

Транзакции и mysql
Привет всем. Возник вопрос следующего плана. К примеру есть функция в программе, которая делает INSERT запрос в бд. Доступ к этой функции,...

php+MySQL транзакции
Доброго времени суток! Есть такая задача: Создайте приложение (PHP + MySQL), которое позволяет переводить сумму со СЧЕТА 1 на СЧЕТ 2....

C++ Builder, mySQL и транзакции
Добрый день! Подскажите неопытному... Есть база на mySQL. Есть приложение на C++ Builder. Подключаюсь к базе через...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
5
Ответ Создать тему
Новые блоги и статьи
Автоматическое создание документа при проведении другого документа
Maks 29.03.2026
Реализация из решения ниже выполнена на нетиповых документах, разработанных в конфигурации КА2. Есть нетиповой документ "ЗаявкаНаРемонтСпецтехники" и нетиповой документ "ПланированиеСпецтехники". В. . .
Настройка движения справочника по регистру сведений
Maks 29.03.2026
Решение ниже реализовано на примере нетипового справочника "ТарифыМобильнойСвязи" разработанного в конфигурации КА2, с целью учета корпоративной мобильной связи в коммерческом предприятии. . . .
Автозаполнение реквизита при выборе элемента справочника
Maks 27.03.2026
Программный код из решения ниже на примере нетипового документа "ЗаявкаНаРемонтСпецтехники" разработанного в конфигурации КА2. При выборе "Спецтехники" (Тип Справочник. Спецтехника), заполняется. . .
Сумматор с применением элементов трёх состояний.
Hrethgir 26.03.2026
Тут. https:/ / fips. ru/ EGD/ ab3c85c8-836d-4866-871b-c2f0c5d77fbc Первый документ красиво выглядит, но без схемы. Это конечно не даёт никаких плюсов автору, но тем не менее. . . всё может быть. . .
Автозаполнение реквизитов при создании документа
Maks 26.03.2026
Программный код из решения ниже размещается в модуле объекта документа, в процедуре "ПриСозданииНаСервере". Алгоритм проверки заполнения реализован для исключения перезаписи значения реквизита,. . .
Команды формы и диалоговое окно
Maks 26.03.2026
1. Команда формы "ЗаполнитьЗапчасти". Программный код из решения ниже на примере нетипового документа "ЗаявкаНаРемонтСпецтехники" разработанного в конфигурации КА2. В качестве источника данных. . .
Кому нужен AOT?
DevAlt 26.03.2026
Решил сделать простой ланчер Написал заготовку: dotnet new console --aot -o UrlHandler var items = args. Split(":"); var tag = items; var id = items; var executable = args;. . .
Отправка уведомления на почту при создании или изменении элементов справочника
Maks 24.03.2026
Программная отправка письма электронной почты на примере типового справочника "Склады" в конфигурации БП3. Перед реализацией необходимо выполнить настройку системной учетной записи электронной. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru