С Новым годом! Форум программистов, компьютерный форум, киберфорум
Python: Web
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.55/11: Рейтинг темы: голосов - 11, средняя оценка - 4.55
 Аватар для IRIP
514 / 146 / 28
Регистрация: 18.04.2015
Сообщений: 1,904
Записей в блоге: 16

Python3 записать данные базу данных

18.11.2018, 22:12. Показов 2106. Ответов 14
Метки нет (Все метки)

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

Структура таблицы и "как это сделатЬ" описано в справке

но там же, сказано, что нужно учиться избегать иньекций (?) и делать по умному, а то можно обрушить базу
+ ко всему, при запросе, попадаются дубли

как быть с ними?

Вот такой код - на сколько он правилен?
база рабочая, не хотелось бы терять данные, если что-то пойдет не так

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
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
import requests
import time
import json
import config as cnf
 
def main():
    date_x = get_mysql_time_post()  # дата последнего поста
    count = 2
    offset = 0
 
    while True:
 
        r = requests.get(
            'https://api.vk.com/method/wall.get',
            params={
                'owner_id': cnf.owner_id,
                'count': count,
                'offset': offset,
                'access_token': cnf.token,
                'version':5.60
            }
        )
        posts = r.json()['response']
        date_start = posts[-1]['date']
        offset += 1
 
        for post in posts:
            print(get_data(post))
 
        time.sleep(5)
 
 
def get_data(post):
    try:
        post_id = post['id']
    except:
        post_id = 'null'
 
    try:
        post_date = post['date']
    except:
        post_date = 'null'
 
    try:
        post_title = post_text.split('\n\n')[0]
    except:
        post_title = (post_id, 'постовоый')
 
    try:
        post_text = post['text']
    except:
        post_text = '* * *'
 
    data = {
        'id': post_id,
        'date': post_date,
        'title': post_title,
        'text': post_text
    }
 
    return data
 
 
def save_photos(photos_id):
    photo = requests.get(
        'https://api.vk.com/method/photos.getById',
        params = {
            'access_token': cnf.token,
            'photos': photo_id,
            'photo_sizes': 1
        }
    )
    r = requests.get(
        photo.json()['response'][0]["sizes"][-1]['src']
    )
    with open('img/%s.jpg' % photo.json()['response'][0]["id"], 'wb') as f:
        f.write(r.content)
 
 
def get_mysql_time_post():
    '''
    Получаем дату последнего поста (для продолжения)
    дату нужно будет конвертировать в Unix time и выдать системе
    только цифры Unix time последнего поста
    '''
    import vk_api
    import config as cnf
    import time
    import MySQLdb
 
 
    db = MySQLdb.connect(
    #Открыть соединение с базой данных
        cnf.mysql_host,
        cnf.mysql_user,
        cnf.mysql_pass,
        cnf.mysql_base
    )
 
    cursor = db.cursor()
    #Подготовка объекта cursor с помощью метода cursor()
    user_id = 2735
    blog_id = 239
 
    cursor.execute(
        "SELECT max(pubdate) FROM cms_blog_posts WHERE user_id = %s AND blog_id = %s",
            (
                user_id, blog_id
            )
        )
 
    try:
        data = cursor.fetchone()
    except:
        print('Ошибка получения запроса')
 
    # Отключение от сервера
    db.close()
 
    unix_time = int(time.mktime(time.strptime(str(data[0]), '%Y-%m-%d %H:%M:%S')))
 
    return unix_time
 
 
def save_mysql():
    '''
    сохраняем пост в mysql
    '''
 
    db = MySQLdb.connect(  #Открыть соединение с базой данных
        cnf.mysql_host,
        cnf.mysql_user,
        cnf.mysql_pass,
        cnf.mysql_base,
        charset = 'utf8'
    )
 
    cursor = db.cursor()
    #Формируем cursor()
 
    sql = """INSERT INTO cms_blog_posts(
                id, user_id, cat_id, blog_id, pubdate, title, feel, music, content,
                content_html, allow_who, edit_times, edit_date, published, seolink,
                comments, comments_count, rating, metadesc, hits, pagetitle,
                meta_keys, meta_desc
            )
            VALUES (
                        '%(id)s', '%(user_id)s', '%(cat_id)s', '%(blog_id)s', '%(pubdate)s', '%(title)s', '%(feel)s', '%(music)s', '%(content)s', '%(content_html)s', '%(allow_who)s', '%(edit_times)s', '%(edit_date)s', '%(published)s', '%(seolink)s', '%(comments)s', '%(comments_count)s', '%(rating)s', '%(metadesc)s', '%(hits)s', '%(pagetitle)s', '%(meta_keys)s', '%(meta_desc)s'
                    )"""%{
                            'id': id, 'user_id': user_id, 'cat_id': cat_id, 'blog_id': blog_id, 'pubdate': pubdate, 'title': title, 'feel':feel, 'music': music, 'content': content, 'content_html': content_html, 'allow_who': allow_who, 'edit_times': edit_times, 'edit_date': edit_date, 'published': published, 'seolink': seolink, 'comments': comments, 'comments_count': comments_count, 'rating': rating, 'metadesc': metadesc, 'hits': hits, 'pagetitle': pagetitle, 'meta_keys': meta_keys, 'meta_desc': meta_desc
                    }
    try:
        cursor.execute(sql)
        #Выполнить команду SQL
 
        db.commit()
        #Зафиксировать изменения в базе данных
    except:
        db.rollback()
        #Откат в случае ошибки
 
    db.close()
    #Отключение от сервера
 
 
if __name__ == '__main__':
    main()
0
cpp_developer
Эксперт
20123 / 5690 / 1417
Регистрация: 09.04.2010
Сообщений: 22,546
Блог
18.11.2018, 22:12
Ответы с готовыми решениями:

Записать данные в mysql базу
Добрый день всем Помогите, как мне записать данные в конкретную ячейку MySQL базы база: xf таблица: xf_phrase Мне надо...

При вставке данных в базу данных повышается autoincrement, но данные не вставляются
Всем доброго дня. Существует некая функция log, отправляющая в БД (MySQL 5.6) запрос на добавление новой строки. def log(logtype,...

Записать данные из textbox в базу данных
Подскажите, пытаюсь записать данные из textbox, в базу данных : c.CommandText = " insert into фио (фамилия,имя,отчество)...

14
Эксперт Python
5438 / 3859 / 1215
Регистрация: 28.10.2013
Сообщений: 9,552
Записей в блоге: 1
18.11.2018, 23:25
Цитата Сообщение от IRIP Посмотреть сообщение
на сколько он правилен?
В метод cursor.execute(sql) всегда нужно передавать два параметра: sql выражение и кортеж данных. Это и есть защита от sql инъекций на уровне драйвера БД. А то что у вас в коде - это открытая дверь для них. Уже многократно здесь писалось: никогда не подставляйте в sql выражения данные через форматирование.
0
 Аватар для IRIP
514 / 146 / 28
Регистрация: 18.04.2015
Сообщений: 1,904
Записей в блоге: 16
18.11.2018, 23:38  [ТС]
Garry Galler, как раз об этом я и говорю - как сделать правильно?
0
Эксперт Python
5438 / 3859 / 1215
Регистрация: 28.10.2013
Сообщений: 9,552
Записей в блоге: 1
18.11.2018, 23:53
Цитата Сообщение от IRIP Посмотреть сообщение
как раз об этом я и говорю - как сделать правильно?
SQL
1
2
3
4
5
"SELECT max(pubdate) FROM cms_blog_posts WHERE user_id = %s AND blog_id = %s",
            (
                user_id, blog_id
            )
        )
Вот и делайте везде.
"%s, %s, %s" % (1,2,3) => плохо
"%s, %s, %s", (1,2,3) => хорошо
0
 Аватар для IRIP
514 / 146 / 28
Регистрация: 18.04.2015
Сообщений: 1,904
Записей в блоге: 16
18.11.2018, 23:57  [ТС]
Garry Galler, да, но тот пример был для запроса
а этот для добавления. Мне еще сформировать переменные нужно, я вроде их сформировал

в def save_mysql():

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
def save_mysql():
    '''
    сохраняем пост в mysql
    '''
 
    db = MySQLdb.connect(  #Открыть соединение с базой данных
        cnf.mysql_host,
        cnf.mysql_user,
        cnf.mysql_pass,
        cnf.mysql_base,
        charset = 'utf8'
    )
 
    cursor = db.cursor()
    #Формируем cursor()
 
    sql = """INSERT INTO cms_blog_posts(
                id, user_id, cat_id, blog_id, pubdate, title, feel, music, content,
                content_html, allow_who, edit_times, edit_date, published, seolink,
                comments, comments_count, rating, metadesc, hits, pagetitle,
                meta_keys, meta_desc
            )
            VALUES (
                '%(id)s', '%(user_id)s', '%(cat_id)s', '%(blog_id)s', '%(pubdate)s', '%(title)s', '%(feel)s', '%(music)s', '%(content)s', '%(content_html)s', '%(allow_who)s', '%(edit_times)s', '%(edit_date)s', '%(published)s', '%(seolink)s', '%(comments)s', '%(comments_count)s', '%(rating)s', '%(metadesc)s', '%(hits)s', '%(pagetitle)s', '%(meta_keys)s', '%(meta_desc)s'
            )"""%{
                'id': id, 'user_id': user_id, 'cat_id': cat_id, 'blog_id': blog_id, 'pubdate': pubdate, 'title': title, 'feel':feel, 'music': music, 'content': content, 'content_html': content_html, 'allow_who': allow_who, 'edit_times': edit_times, 'edit_date': edit_date, 'published': published, 'seolink': seolink, 'comments': comments, 'comments_count': comments_count, 'rating': rating, 'metadesc': metadesc, 'hits': hits, 'pagetitle': pagetitle, 'meta_keys': meta_keys, 'meta_desc': meta_desc
                    }
    try:
        cursor.execute(sql)
        #Выполнить команду SQL
 
        db.commit()
        #Зафиксировать изменения в базе данных
    except:
        db.rollback()
        #Откат в случае ошибки
 
    db.close()
    #Отключение от сервера
о ней как раз речь
0
Эксперт Python
5438 / 3859 / 1215
Регистрация: 28.10.2013
Сообщений: 9,552
Записей в блоге: 1
19.11.2018, 00:08
Поскольку mysqldb поддерживает стиль pyformat с именованными параметрами,
SQL
1
cur.execute("SELECT SLEEP(%(time)s)", {'time':n})
то достаточно убрать %.
Python
1
2
3
4
5
6
7
8
9
10
11
12
13
sql = """INSERT INTO cms_blog_posts(
                id, user_id, cat_id, blog_id, pubdate, title, feel, music, content,
                content_html, allow_who, edit_times, edit_date, published, seolink,
                comments, comments_count, rating, metadesc, hits, pagetitle,
                meta_keys, meta_desc
            )
            VALUES (
                '%(id)s', '%(user_id)s', '%(cat_id)s', '%(blog_id)s', '%(pubdate)s', '%(title)s', '%(feel)s', '%(music)s', '%(content)s', '%(content_html)s', '%(allow_who)s', '%(edit_times)s', '%(edit_date)s', '%(published)s', '%(seolink)s', '%(comments)s', '%(comments_count)s', '%(rating)s', '%(metadesc)s', '%(hits)s', '%(pagetitle)s', '%(meta_keys)s', '%(meta_desc)s'
            )"""
 
dict_param= {
                'id': id, 'user_id': user_id, 'cat_id': cat_id, 'blog_id': blog_id, 'pubdate': pubdate, 'title': title, 'feel':feel, 'music': music, 'content': content, 'content_html': content_html, 'allow_who': allow_who, 'edit_times': edit_times, 'edit_date': edit_date, 'published': published, 'seolink': seolink, 'comments': comments, 'comments_count': comments_count, 'rating': rating, 'metadesc': metadesc, 'hits': hits, 'pagetitle': pagetitle, 'meta_keys': meta_keys, 'meta_desc': meta_desc
                    }
Добавлено через 2 минуты
Точнее вторую часть - с параметрами - передать сюда:
cursor.execute(sql, dict_param), а SQL выражение оставить (без параметров).
0
 Аватар для IRIP
514 / 146 / 28
Регистрация: 18.04.2015
Сообщений: 1,904
Записей в блоге: 16
19.11.2018, 00:17  [ТС]
Garry Galler, где поубирать %

так?

)
VALUES (
'(id)s', '(user_id)s', '(cat_id)s', '(blog_id)s', '(pubdate)s',

а смысл?

мне ведь в эту функцию нужно будет параметры передавать
0
Эксперт Python
5438 / 3859 / 1215
Регистрация: 28.10.2013
Сообщений: 9,552
Записей в блоге: 1
19.11.2018, 00:18
Я пример полностью отформатировал как нужно. Смотрите внимательнее.
1
 Аватар для IRIP
514 / 146 / 28
Регистрация: 18.04.2015
Сообщений: 1,904
Записей в блоге: 16
19.11.2018, 00:19  [ТС]
Везде приводят пример, как я писал

Python
1
2
3
4
5
6
7
8
9
10
11
12
13
#ниже блок кода для работы с базой
#создаем подключение к БД
db = MySQLdb.connect(host="localhost", user="vash_user", passwd="vash_pass", db="py", charset='utf8')
#используя метод cursor() получаем объект для работы с базой
cursor = db.cursor()
#формируем sql запрос на запись
sql = """INSERT INTO zp(zp)
        VALUES ('%(zarplata)s')
        """%{"zarplata":av_zp}
# исполняем SQL-запрос
cursor.execute(sql)
# применяем изменения к базе данных
db.commit()
но я где-то читал, что он не правильный, уязвимый
0
Эксперт Python
5438 / 3859 / 1215
Регистрация: 28.10.2013
Сообщений: 9,552
Записей в блоге: 1
19.11.2018, 00:21
Еще раз. Внимательнее рассмотрите пример. И попытайтесь понять разницу.
Python
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
sql = """INSERT INTO cms_blog_posts(
                id, user_id, cat_id, blog_id, pubdate, title, feel, music, content,
                content_html, allow_who, edit_times, edit_date, published, seolink,
                comments, comments_count, rating, metadesc, hits, pagetitle,
                meta_keys, meta_desc
            )
            VALUES (
                '%(id)s', '%(user_id)s', '%(cat_id)s', '%(blog_id)s', '%(pubdate)s', '%(title)s', '%(feel)s', '%(music)s', '%(content)s', '%(content_html)s', '%(allow_who)s', '%(edit_times)s', '%(edit_date)s', '%(published)s', '%(seolink)s', '%(comments)s', '%(comments_count)s', '%(rating)s', '%(metadesc)s', '%(hits)s', '%(pagetitle)s', '%(meta_keys)s', '%(meta_desc)s'
            )"""
 
dict_param= {
                'id': id, 'user_id': user_id, 'cat_id': cat_id, 'blog_id': blog_id, 'pubdate': pubdate, 'title': title, 'feel':feel, 'music': music, 'content': content, 'content_html': content_html, 'allow_who': allow_who, 'edit_times': edit_times, 'edit_date': edit_date, 'published': published, 'seolink': seolink, 'comments': comments, 'comments_count': comments_count, 'rating': rating, 'metadesc': metadesc, 'hits': hits, 'pagetitle': pagetitle, 'meta_keys': meta_keys, 'meta_desc': meta_desc
                    }
 
cursor.execute(sql, dict_param)
Добавлено через 28 секунд
Это очень большая разница.
1
 Аватар для IRIP
514 / 146 / 28
Регистрация: 18.04.2015
Сообщений: 1,904
Записей в блоге: 16
19.11.2018, 00:34  [ТС]
Garry Galler, и dict_param

можно вынести в main()


как-то так.

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
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
import requests
import MySQLdb
import time
import json
import config as cnf
 
def main():
    date_x = get_mysql_time_post()  # дата последнего поста
    count = 2
    offset = 0
 
    while True:
        sql_dict = {
            'id': id,
            'user_id': user_id,
            'cat_id': cat_id,
            'blog_id': blog_id,
            'pubdate': pubdate,
            'title': title,
            'feel':feel, 'music': music, 'content': content, 'content_html': content_html, 'allow_who': allow_who, 'edit_times': edit_times, 'edit_date': edit_date, 'published': published, 'seolink': seolink, 'comments': comments, 'comments_count': comments_count, 'rating': rating, 'metadesc': metadesc, 'hits': hits, 'pagetitle': pagetitle, 'meta_keys': meta_keys, 'meta_desc': meta_desc
        }
 
        r = requests.get(
            'https://api.vk.com/method/wall.get',
            params={
                'owner_id': cnf.owner_id,
                'count': count,
                'offset': offset,
                'access_token': cnf.token,
                'version':5.60
            }
        )
        posts = r.json()['response']
        date_start = posts[-1]['date']
        offset += 1
 
        for post in posts:
            print(get_data(post))
 
        time.sleep(5)
 
 
def get_data(post):
    try:
        post_id = post['id']
    except:
        post_id = 'null'
 
    try:
        post_date = post['date']
    except:
        post_date = 'null'
 
    try:
        post_text = post['text']
    except:
        post_text = '* * *'
 
    try:
        post_title = post_text.split('<br>')[0]
    except:
        post_title = (post_id, 'постовоый')
 
    data = {
        'id': post_id,
        'date': post_date,
        'title': post_title,
        'text': post_text
    }
 
    return data
 
 
def save_photos(photos_id):
    photo = requests.get(
        'https://api.vk.com/method/photos.getById',
        params = {
            'access_token': cnf.token,
            'photos': photo_id,
            'photo_sizes': 1
        }
    )
    r = requests.get(
        photo.json()['response'][0]["sizes"][-1]['src']
    )
    with open('img/%s.jpg' % photo.json()['response'][0]["id"], 'wb') as f:
        f.write(r.content)
 
 
def get_mysql_time_post():
    '''
    Получаем дату последнего поста (для продолжения)
    дату нужно будет конвертировать в Unix time и выдать системе
    только цифры Unix time последнего поста
    '''
 
 
 
    db = MySQLdb.connect(
    #Открыть соединение с базой данных
        cnf.mysql_host,
        cnf.mysql_user,
        cnf.mysql_pass,
        cnf.mysql_base
    )
 
    cursor = db.cursor()
    #Подготовка объекта cursor с помощью метода cursor()
    user_id = 2735
    blog_id = 239
 
    cursor.execute(
        "SELECT max(pubdate) FROM cms_blog_posts WHERE user_id = %s AND blog_id = %s",
            (
                user_id, blog_id
            )
        )
 
    try:
        data = cursor.fetchone()
    except:
        print('Ошибка получения запроса')
 
    # Отключение от сервера
    db.close()
 
    unix_time = int(time.mktime(time.strptime(str(data[0]), '%Y-%m-%d %H:%M:%S')))
 
    return unix_time
 
 
def save_mysql(sql_dict):
    '''
    сохраняем пост в mysql
    '''
 
    db = MySQLdb.connect(  #Открыть соединение с базой данных
        cnf.mysql_host,
        cnf.mysql_user,
        cnf.mysql_pass,
        cnf.mysql_base,
        charset = 'utf8'
    )
 
    cursor = db.cursor()
    #Формируем cursor()
 
    sql = """INSERT INTO cms_blog_posts(
                id, user_id, cat_id, blog_id, pubdate, title, feel, music, content,
                content_html, allow_who, edit_times, edit_date, published, seolink,
                comments, comments_count, rating, metadesc, hits, pagetitle,
                meta_keys, meta_desc
            )
            VALUES (
                '%(id)s', '%(user_id)s', '%(cat_id)s', '%(blog_id)s', '%(pubdate)s', '%(title)s', '%(feel)s', '%(music)s', '%(content)s', '%(content_html)s', '%(allow_who)s', '%(edit_times)s', '%(edit_date)s', '%(published)s', '%(seolink)s', '%(comments)s', '%(comments_count)s', '%(rating)s', '%(metadesc)s', '%(hits)s', '%(pagetitle)s', '%(meta_keys)s', '%(meta_desc)s'
            )"""
    try:
        cursor.execute(sql, sql_dict)
        #Выполнить команду SQL
 
        db.commit()
        #Зафиксировать изменения в базе данных
    except:
        db.rollback()
        #Откат в случае ошибки
 
    db.close()
    #Отключение от сервера
 
 
if __name__ == '__main__':
    main()
0
Эксперт Python
5438 / 3859 / 1215
Регистрация: 28.10.2013
Сообщений: 9,552
Записей в блоге: 1
19.11.2018, 01:53
Цитата Сообщение от IRIP Посмотреть сообщение
unix_time = int(time.mktime(time.strptime(str(data[0]), '%Y-%m-%d %H:%M:%S')))
А про unix time я вам в другой теме писал - что не нужно городить огород из функций преобразований - все проще.
0
 Аватар для IRIP
514 / 146 / 28
Регистрация: 18.04.2015
Сообщений: 1,904
Записей в блоге: 16
19.11.2018, 11:31  [ТС]
Garry Galler, Возникли небольшие трудности.

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

user_id, blog_id, pubdate, title, content_html, seolink, pagetitle, meta_keys, meta_desc

все остальные - фиксированные значения, или устанавливаются автоматически (id)

Добавлено через 1 минуту
в content_html должны вставляться все attachments

Добавлено через 6 часов 42 минуты
* * *

проще говоря - можно заполнять не все поля, а только некоторые? или нужно все?

Добавлено через 53 минуты
Garry Galler, сделал так - но очень много ошибок


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
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
import requests
import MySQLdb
import time
import json
import config as cnf
 
def main():
    date_x = get_mysql_time_post()  # дата последнего поста
    count = 2
    offset = 0
 
    while True:
        sql_dict = {
            'id': id,  # это должно генерироваться автоматом. Как?
            'user_id': cnf.user_id,
            'cat_id': '0',
            'blog_id': cnf.blog_id,
            'pubdate': pubdate,
            'title': title,
            'feel': '',
            'music': '',
            'content': content, 'content_html': content,
            'allow_who': 'all',
            'edit_times': '0',
            'edit_date': pubdate,
            'published': '1',
            'seolink': seolink,  # должен генерироваться из тайтл (не длинне 50)
            'comments': '1',
            'comments_count': '0',
            'rating': 1,
            'metadesc': meta_desc,
            'hits': '20',
            'pagetitle': title,
            'meta_keys': meta_keys,  # просто слова, через запятую?
            'meta_desc': meta_desc
        }
 
        r = requests.get(
            'https://api.vk.com/method/wall.get',
            params={
                'owner_id': cnf.owner_id,
                'count': count,
                'offset': offset,
                'access_token': cnf.token,
                'version':5.60
            }
        )
        posts = r.json()['response']
        date_start = posts[-1]['date']
        offset += 1
 
        for post in posts:
            print(get_data(post))
 
        time.sleep(5)
 
 
def get_data(post):
    try:
        post_id = post['id']
    except:
        post_id = 'null'
 
    try:
        post_date = post['date']
    except:
        post_date = 'null'
 
    try:
        post_text = post['text']
    except:
        post_text = '* * *'
 
    try:
        post_title = post_text.split('<br>')[0]
    except:
        post_title = (post_id, 'постовоый')
 
    data = {
        'id': post_id,
        'date': post_date,
        'title': post_title,
        'text': post_text
    }
 
    return data
 
 
def save_photos(photos_id):
    photo = requests.get(
        'https://api.vk.com/method/photos.getById',
        params = {
            'access_token': cnf.token,
            'photos': photo_id,
            'photo_sizes': 1
        }
    )
    r = requests.get(
        photo.json()['response'][0]["sizes"][-1]['src']
    )
    with open('img/%s.jpg' % photo.json()['response'][0]["id"], 'wb') as f:
        f.write(r.content)
 
 
def get_mysql_time_post():
    '''
    Получаем дату последнего поста (для продолжения)
    дату нужно будет конвертировать в Unix time и выдать системе
    только цифры Unix time последнего поста
    '''
 
 
 
    db = MySQLdb.connect(
    #Открыть соединение с базой данных
        cnf.mysql_host,
        cnf.mysql_user,
        cnf.mysql_pass,
        cnf.mysql_base
    )
 
    cursor = db.cursor()
    #Подготовка объекта cursor с помощью метода cursor()
    user_id = 2735
    blog_id = 239
 
    cursor.execute(
        "SELECT max(pubdate) FROM cms_blog_posts WHERE user_id = %s AND blog_id = %s",
            (
                user_id, blog_id
            )
        )
 
    try:
        data = cursor.fetchone()
    except:
        print('Ошибка получения запроса')
 
    # Отключение от сервера
    db.close()
 
    unix_time = int(time.mktime(time.strptime(str(data[0]), '%Y-%m-%d %H:%M:%S')))
 
    return unix_time
 
 
def save_mysql(sql_dict):
    '''
    сохраняем пост в mysql
    '''
 
    db = MySQLdb.connect(  #Открыть соединение с базой данных
        cnf.mysql_host,
        cnf.mysql_user,
        cnf.mysql_pass,
        cnf.mysql_base,
        charset = 'utf8'
    )
 
    cursor = db.cursor()
    #Формируем cursor()
 
    sql = """INSERT INTO cms_blog_posts(
                id, user_id, cat_id, blog_id, pubdate, title, feel, music, content,
                content_html, allow_who, edit_times, edit_date, published, seolink,
                comments, comments_count, rating, metadesc, hits, pagetitle,
                meta_keys, meta_desc
            )
            VALUES (
                '%(id)s', '%(user_id)s', '%(cat_id)s', '%(blog_id)s', '%(pubdate)s', '%(title)s', '%(feel)s', '%(music)s', '%(content)s', '%(content_html)s', '%(allow_who)s', '%(edit_times)s', '%(edit_date)s', '%(published)s', '%(seolink)s', '%(comments)s', '%(comments_count)s', '%(rating)s', '%(metadesc)s', '%(hits)s', '%(pagetitle)s', '%(meta_keys)s', '%(meta_desc)s'
            )"""
    try:
        cursor.execute(sql, sql_dict)
        #Выполнить команду SQL
 
        db.commit()
        #Зафиксировать изменения в базе данных
    except:
        db.rollback()
        #Откат в случае ошибки
 
    db.close()
    #Отключение от сервера
 
 
if __name__ == '__main__':
    main()
Добавлено через 30 минут
Garry Galler, в этом коде, важно чтобы в цикле while после каждого запроса сразу результат записывался в базу
и не хранился в памяти
0
Эксперт Python
5438 / 3859 / 1215
Регистрация: 28.10.2013
Сообщений: 9,552
Записей в блоге: 1
20.11.2018, 15:45
Оборачивать в try нужно execute. Прочитайте про контекстные менеджеры - с их помощью можно написать обработчики ошибок со всей нужной логикой, а затем просто писать:
Python
1
2
3
with Transaction(self, op='INSERT', query=query, row=row,
    ) as tr:
    result = tr.execute(query, row)
а КМ уже сам и commit сделает, если все ОК и rollback, если ошибка и залогирует все что нужно.

Перехватывать нужно конкретные ошибки БД (спускаясь от возможной ошибки нижнего уровня к самой верхней - Exception), а не любые (любые это когда нажал Сtrl+С - получил KeyboardInterrupt и оно тоже зачем-то перехватилось у вас).

Цитата Сообщение от IRIP Посмотреть сообщение
можно заполнять не все поля, а только некоторые? или нужно все?
Я об это уже писал (в другой вашей теме). И как можно передавать данные в случае для всех столбцов, и в случае для части столбцов.
0
 Аватар для IRIP
514 / 146 / 28
Регистрация: 18.04.2015
Сообщений: 1,904
Записей в блоге: 16
20.11.2018, 16:25  [ТС]
Цитата Сообщение от Garry Galler Посмотреть сообщение
Я об это уже писал (в другой вашей теме). И как можно передавать данные в случае для всех столбцов, и в случае для части столбцов.
Спасибо, поищу
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
raxper
Эксперт
30234 / 6612 / 1498
Регистрация: 28.12.2010
Сообщений: 21,154
Блог
20.11.2018, 16:25
Помогаю со студенческими работами здесь

Как записать данные в базу данных?
Доброе время суток, а подскажите пожалуйста, как записать в таблицу список:( 1 строка 2 строка 3 строка) данных?

Как записать данные в базу данных из Spry
Уважаемые форумчане помогите разобраться! Создал в Dreamweaver &quot;панель с вкладками&quot; с помощью Spry. На каждой вкладке есть...

Можно ли записать данные из сервера в базу данных 1С?
Доброго времени суток. Встал вопрос на счет добавления данных из сервера в бд 1С. В 1С пока что не разбираюсь, на данный момент нужно чтобы...

Программно из таблицы Word записать данные в базу данных SQL
Здравствуйте, можно это сделать? таблица из двух столбцов, и для общего развития база данных SQL, это файл с каким расширением? Про базы...

Не могу подключить базу данных mysql python3.4+django1.7.1
на винде7 под апачем поднял питон3,4+джанго1,7, но не получается соединить все это с mysql версия mysql 5.0.3.7 Пробовал как в этой...


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

Или воспользуйтесь поиском по форуму:
15
Ответ Создать тему
Новые блоги и статьи
Первый деплой
lagorue 16.01.2026
Не спеша развернул своё 1ое приложение в kubernetes. А дальше мне интересно создать 1фронтэнд приложения и 2 бэкэнд приложения развернуть 2 деплоя в кубере получится 2 сервиса и что-бы они. . .
Расчёт переходных процессов в цепи постоянного тока
igorrr37 16.01.2026
/ * Дана цепь постоянного тока с R, L, C, k(ключ), U, E, J. Программа составляет систему уравнений по 1 и 2 законам Кирхгофа, решает её и находит токи на L и напряжения на C в установ. режимах до и. . .
Восстановить юзерскрипты Greasemonkey из бэкапа браузера
damix 15.01.2026
Если восстановить из бэкапа профиль Firefox после переустановки винды, то список юзерскриптов в Greasemonkey будет пустым. Но восстановить их можно так. Для этого понадобится консольная утилита. . .
Изучаю kubernetes
lagorue 13.01.2026
А пригодятся-ли мне знания kubernetes в России?
Сукцессия микоризы: основная теория в виде двух уравнений.
anaschu 11.01.2026
https:/ / rutube. ru/ video/ 7a537f578d808e67a3c6fd818a44a5c4/
WordPad для Windows 11
Jel 10.01.2026
WordPad для Windows 11 — это приложение, которое восстанавливает классический текстовый редактор WordPad в операционной системе Windows 11. После того как Microsoft исключила WordPad из. . .
Classic Notepad for Windows 11
Jel 10.01.2026
Old Classic Notepad for Windows 11 Приложение для Windows 11, позволяющее пользователям вернуть классическую версию текстового редактора «Блокнот» из Windows 10. Программа предоставляет более. . .
Почему дизайн решает?
Neotwalker 09.01.2026
В современном мире, где конкуренция за внимание потребителя достигла пика, дизайн становится мощным инструментом для успеха бренда. Это не просто красивый внешний вид продукта или сайта — это. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru