Гость
Целевая тема:
Создать новую тему:
Автор:
Форумы / PHP, Perl, Python [игнор отключен] [закрыт для гостей] / [Python] Функция вставила не все записи / 3 сообщений из 3, страница 1 из 1
09.11.2012, 09:04
    #38031195
vlad52
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
[Python] Функция вставила не все записи
Модератор:
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
09.11.2012, 21:11
    #38032541
SergSW
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
[Python] Функция вставила не все записи
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
11.11.2012, 13:37
    #38033564
vladK
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
[Python] Функция вставила не все записи
Обратите внимание на тип поля целевой таблицы куда вставляете значение:
'10 коробок по 20 пакетиков'

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

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


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