powered by simpleCommunicator - 2.0.61     © 2026 Programmizd 02
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Форумы / PHP, Perl, Python [игнор отключен] [закрыт для гостей] / [Python] Функция вставила не все записи
3 сообщений из 3, страница 1 из 1
[Python] Функция вставила не все записи
    #38031195
vlad52
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Модератор:
vlad52 , не забываем впредь самостоятельно указывать язык программирования в теме обсуждения.
--
vkle



Я написал следующие функции по переносу данных из Access в Firebird
+

Код: 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.
    def FirebirdDatetime(dt):
		return '\'%s.%s.%s\'' % (str(dt.day).rjust(2,'0'),
									   str(dt.month).rjust(2,'0'),
									   str(dt.year).rjust(4,'0'))

	def SelectFromAccessTable(tablename):
		return 'select * from [' + tablename+']'

	def InsertToFirebirdTable(tablename, row):
		values=''
		i=0
		for elem in row:
			i+=1
			#print type(elem)
		if type(elem) == int:
				temp = str(elem)
			elif (type(elem) == str) or (type(elem)==unicode):
				temp = '\'%s\'' % (elem,)
			elif type(elem) == datetime.datetime:
				temp =FirebirdDatetime(elem)
			elif type(elem) == decimal.Decimal:
				temp = str(elem)
			elif elem==None:
				 temp='null'        
		if (i<len(row)):
					values+=temp+', '                 
			else:
					values+=temp
		return 'insert into '+tablename+' values ('+values+')'

	def AccessToFirebird(accesstablename, firebirdtablename, accesscursor, firebirdcursor):
		SelectSql=SelectFromAccessTable(accesstablename)
		for row in accesscursor.execute(SelectSql):
			InsertSql=InsertToFirebirdTable(firebirdtablename, row)
			InsertSql=InsertSql
			print InsertSql
			firebirdcursor.execute(InsertSql)



В основном модуле происходит вызов функции AccessToFirebird
+

Код: 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.
	conAcc = pyodbc.connect('DRIVER={Microsoft Access Driver (*.mdb, *.accdb)};DBQ=D:\ThirdTask\Northwind.accdb')
	SqlAccess=conAcc.cursor();
	conn.begin()
	cur=conn.cursor()
	sql.AccessToFirebird('Customers', 'CLIENTS', SqlAccess, cur)
	conn.commit()
	conn.begin()
	cur=conn.cursor()
	sql.AccessToFirebird('Сотрудники', 'EMPLOYEES', SqlAccess, cur)
	sql.AccessToFirebird('Роли', 'ROLES', SqlAccess, cur)
	sql.AccessToFirebird('Роли сотрудников', 'EMPLOYEES_ROLES', SqlAccess, cur)
	sql.AccessToFirebird('Доставка', 'DELIVERY', SqlAccess, cur)
	sql.AccessToFirebird('Поставщики', 'SUPPLIERS', SqlAccess, cur)
	sql.AccessToFirebird('Налоговый статус заказов', 'TAX_STATUS_OF_ORDERS', SqlAccess, cur)
	sql.AccessToFirebird('Состояние сведений о заказе', 'STATE_ORDER_DETAILS', SqlAccess, cur)
	sql.AccessToFirebird('Состояние заказов', 'CONDITION_OF_ORDERS', SqlAccess, cur)
	sql.AccessToFirebird('Заказы', 'ORDERS', SqlAccess, cur)
	sql.AccessToFirebird('Счета', 'BILLS', SqlAccess, cur)
	sql.AccessToFirebird('Состояние заказа на приобретение', 'STATUS_PURCHASE_ORDER', SqlAccess, cur)
	sql.AccessToFirebird('Заказы на приобретение', 'ORDERS_FOR_ACQUISITION', SqlAccess, cur)
	sql.AccessToFirebird('Сведения о заказе на приобретение', 'INFORMPURCHASEORDER', SqlAccess, cur)
	sql.AccessToFirebird('Товары', 'PRODUCTS', SqlAccess, cur)
	conn.commit()
	conAcc.commit()
	conn.close()
	conAcc.close()



Но в результате не все записи были вставлены в таблицу Products (Товары - база данных Борей), например, не сработал запрос
Код: python
1.
    insert into PRODUCTS values ('4', 1, 'NWTB-1', 'Цейлонский чай', null, 13.5000, 18.0000, 10, 40, '10 коробок по 20 пакетиков', '10 коробок по 20 пакетиков', 10, 'Напитки', '')


В ibexpert на этот запрос выдало сообщение
Код: python
1.
2.
    can't format message 13:587 -- message file C:\Windows\firebird.msg not found.
    conversion error from string "10 коробок по 20 пакетиков".


Сработали только запросы
Код: python
1.
2.
3.
4.
5.
    insert into PRODUCTS values ('1', 82, 'NWTC-82', 'Гранола', null, 2.0000, 4.0000, 20, 100, null, null, null, 'Каши', '')
    insert into PRODUCTS values ('9', 83, 'NWTCS-83', 'Картофельные чипсы', null, 0.5000, 1.8000, 30, 200, null, null, null, 'Чипсы и закуски', '')
    insert into PRODUCTS values ('1', 97, 'NWTC-82', 'Овсянка', null, 3.0000, 5.0000, 50, 200, null, null, null, 'Каши', '')
    insert into PRODUCTS values ('6', 98, 'NWTSO-98', 'Овощной суп', null, 1.0000, 1.8900, 100, 200, null, null, null, 'Супы', '')
    insert into PRODUCTS values ('6', 99, 'NWTSO-99', 'Куриный бульон', null, 1.0000, 1.9500, 100, 200, null, null, null, 'Супы', '')


остальные записи не были вставлены.
...
Рейтинг: 0 / 0
[Python] Функция вставила не все записи
    #38032541
SergSW
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
vlad52,

авторcan't format message 13:587 -- message file C:\Windows\firebird.msg not found.
conversion error from string "10 коробок по 20 пакетиков".
1. Не нашел message file C:\Windows\firebird.msg (так сразу и хочется спросить а куда fbclient.dll в System заливали?)
2. Сама ошибка похожа на проблему с кодировками.

Firebird какой, не embedded случайно?

А вообще это ошибка не с питоном связана, а с кривыми настройками БД, судя по всему.
...
Рейтинг: 0 / 0
[Python] Функция вставила не все записи
    #38033564
vladK
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Обратите внимание на тип поля целевой таблицы куда вставляете значение:
'10 коробок по 20 пакетиков'

Оно скорее всего не текстовое. (Может стоит явно указать порядок полей PRODUCTS ?)

А те записи которые прошли, в этом поле имеют NULL, поэтому и проходят.
...
Рейтинг: 0 / 0
3 сообщений из 3, страница 1 из 1
Форумы / PHP, Perl, Python [игнор отключен] [закрыт для гостей] / [Python] Функция вставила не все записи
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]