我编写了一个程序,它在一个描述符(数据库,包含数据库 Northwind 的结构 - 在单独的表中,包含表、索引、限制、域的列表)数据库 Northwind 在 Firebird 中构建它。然后我连接到数据库 Northwind (Access),我想通过查询数据库 Northwind (Access) 的表的 SQL 内容复制到创建的相同 Firebird 数据库的表中。
import pyodbc
#import kinterbasdb
import firebirdsql
import os
import json,sqlite3,sql
con = sqlite3.connect('borey.db')
sampling_tables=con.cursor()
sampling_fields=con.cursor()
sampling_constraints=con.cursor()
sampling_constraints_fields=con.cursor()
sampling_indices=con.cursor()
sampling_indices_fields=con.cursor()
sampling_indices_props=con.cursor()
sampling_fields_from_constraints=con.cursor()
js=[]
sampling_tables.execute(sql.sqltables)
for table in sampling_tables:
tabledict=dict(inform_about_table='?', fields='?', constraints='?', indices='?')
information_about_table_dict=dict(name=table[1], description=table[2], can_add=table[3], can_edit=table[4], can_delete=table[5])
#print(js_information_about_table)
tabledict['inform_about_table']=information_about_table_dict
#print(tabledict)
table_id=table[0]
sampling_fields.execute(sql.sqlfields,(table_id,))
listfields=[]
for field in sampling_fields:
fielddict=dict(position=field[0], name=field[1], description=field[2], datatype=field[3], char_length=field[4], can_input=field[5], can_edit=field[6], show_in_grid=field[7],
is_mean=field[8], autocalculated=field[9], required=field[10])
listfields.append(fielddict)
tabledict['fields']=listfields
#print(tabledict)
sampling_constraints.execute(sql.sqlconstraints,(table_id,))
listconstraints=[]
for constraint in sampling_constraints:
constraintdict=dict(name=constraint[1], constrtype=constraint[2], items='?', reference=constraint[3])
sampling_constraints_fields.execute(sql.sql_constr_det,(constraint[0],table_id))
listitems=[]
for constr_det in sampling_constraints_fields:
listitems.append(constr_det[0])
constraintdict['items']=listitems
listconstraints.append(constraintdict)
tabledict['constraints']=listconstraints
#print(tabledict)
sampling_indices.execute(sql.sqlindices,(table_id,))
listindices=[]
for index in sampling_indices:
indexdict=dict(name=index[1], items='?', position='?', props='?')
index_id=index[0]
sampling_indices_fields.execute(sql.sql_indices_fields,(table_id,index_id))
#sampling_indices_props.execute(sql.sql_indices_descend,(table_id,index_id, ))
listfields=[]
listpositions=[]
listprops=[]
for index_det in sampling_indices_fields:
listfields.append(index_det[0])
listpositions.append(index_det[1])
fieldinindex=index_det[0]
sampling_indices_props.execute(sql.sql_indices_descend,(table_id,index_id,fieldinindex))
for index_desc in sampling_indices_props:
listprops.append(index_desc[0])
indexdict['items']=listfields
indexdict['position']=listpositions
indexdict['props']=listprops
listindices.append(indexdict)
tabledict['indices']=listindices
#print(tabledict)
js.append(tabledict)
os.remove('D:/boreas.fdb')
conn=firebirdsql.create_database(host='localhost', database='D:/boreas.fdb', user='sysdba', password='masterkey')
#conn=firebirdsql.connect(host='localhost',database='D:/ThirdTask/test.fdb', user='sysdba', password='masterkey')
cur=conn.cursor()
for nametable in js:
s=''
s+='create table '+nametable['inform_about_table']['name']+'\n'
s+='('+'\n'
countfield=0
for namefield in nametable['fields']:
s+=' '
if namefield['name']=='COUNT':
s+='QUANTITY'
else:
if namefield['name']=='MINIMUM QUANTITY FOR ORDER REPETITION':
s+='MINIMUM_QUANTITY'
else:
if namefield['name']=='PRICE ACCORDING TO THE PRICE-LIST':
s+='LIST_PRICE'
else:
if (namefield['name'].count(' ')!=0) or (namefield['name'].count('-')!=0) or (namefield['name'].count('/')!=0):
s+='"'+namefield['name']+'"'
else:
s+=namefield['name']
if namefield['datatype']=='FMTBCD':
s+=' '+' INTEGER NOT NULL'
else:
if namefield['datatype']=='STRING':
s+=' '+'VARCHAR'
else:
if namefield['datatype']=='MEMO':
s+=' '+'BLOB SUB_TYPE 1'
else:
if namefield['datatype']=='LARGEINT':
s+=' '+'INTEGER'
else:
if namefield['datatype']=='SMALLINT':
s+=' '+'INTEGER'
else:
if namefield['datatype']=='CURRENCY':
s+=' '+'NUMERIC(18,2)'
else:
if namefield['datatype']=='BOOLEAN':
s+=' '+'INTEGER'
else:
s+=' '+namefield['datatype']
if namefield['datatype']=='STRING':
s+='('+str(namefield['char_length'])+')'
countfield+=1
#if countfield!=len(nametable['fields']):
s+=','+'\n'
#else:
#s+='\n'
#s+='\n'
for nameconstraint in nametable['constraints']:
if nameconstraint['constrtype']=='PRIMARY':
s+=' CONSTRAINT '+nameconstraint['name']+ ' PRIMARY KEY('
countfieldinconstr=0
for namefield in nameconstraint['items']:
countfieldinconstr+=1
if countfieldinconstr!=len(nameconstraint['items']):
if (namefield.count(' ')!=0) or (namefield.count('-')!=0) or (namefield.count('/')!=0):
s+='"'+namefield+'"'+','
else:
if namefield=='COUNT':
s+='QUANTITY'+','
else:
s+=namefield+','
else:
if (namefield.count(' ')!=0) or (namefield.count('-')!=0) or (namefield.count('/')!=0):
s+='"'+namefield+'"'+')'+'\n'
else:
if namefield=='COUNT':
s+='QUANTITY'+')'+'\n'
else:
s+=namefield+')'+'\n'
s+=');'+'\n'
print s
cur.execute(s)
#conn.commit()
#conn.begin()
for nameindex in nametable['indices']:
#print 'nameidex[props] ', nameindex['props']
s=''
for prop in nameindex['props']:
if prop==0:
if (nameindex['name'].count(' ')!=0) or (nameindex['name'].count('-')!=0) or (nameindex['name'].count('/')!=0):
s+='create ascending index "'+nameindex['name'] + '" on '+nametable['inform_about_table']['name']+' ('
else:
if nameindex['name']=='IDX_INFORMATION_ABOUT_ORDER_INVENTORY_ID':
s+='create ascending index ' + 'IDX_INVENTORY_ID' + ' on '+nametable['inform_about_table']['name']+' ('
else:
if nameindex['name']=='IDX_INFORMATION_ABOUT_ORDER_ORDERDETAILS':
s+='create ascending index ' + 'IDX_ORDERDETAILS' + ' on '+nametable['inform_about_table']['name']+' ('
else:
if nameindex['name'].count('INFORMATION_ABOUT_ORDER_')!=0:
s+='create ascending index ' + nameindex['name'][1:4]+nameindex['name'][-len(nameindex['name'])+28:] + ' on '+nametable['inform_about_table']['name']+' ('
else:
s+='create ascending index '+nameindex['name'] + ' on '+nametable['inform_about_table']['name']+' ('
countitem=0
for nameitem in nameindex['items']:
if countitem!=len(nameindex['items'])-1:
if (nameitem.count(' ')!=0) or (nameitem.count('-')!=0) or (nameitem.count('/')!=0):
s+='"'+nameitem+'"'+', '
else:
if nameitem=='COUNT':
s+='QUANTITY'+', '
else:
s+=nameitem+', '
else:
if (nameitem.count(' ')!=0) or (nameitem.count('-')!=0) or (nameitem.count('/')!=0):
s+='"'+nameitem+'"'+');'+'\n'
else:
if nameitem=='COUNT':
s+='QUANTITY'+');'+'\n'
else:
s+=nameitem+');'+'\n'
countitem+=1
print s
cur.execute(s)
#conn.commit()
for nametable in js:
for nameconstraint in nametable['constraints']:
if nameconstraint['constrtype']=='FOREIGN':
s=''
s+='ALTER TABLE '+nametable['inform_about_table']['name']+'\n'
s+=' '+'ADD CONSTRAINT '+nameconstraint['name']+' FOREIGN KEY ('
for namefield in nameconstraint['items']:
if (namefield.count(' ')!=0) or (namefield.count('-')!=0) or (namefield.count('/')!=0):
s+='"'+namefield+'")'+'\n'
else:
s+=namefield+')'+'\n'
s+=' '+'REFERENCES '+nameconstraint['reference']
sampling_fields_from_constraints.execute(sql.sql_fields, (nameconstraint['reference'],))
for fields in sampling_fields_from_constraints:
field=fields[0]
if (field.count(' ')!=0) or (field.count('-')!=0) or (field.count('/')!=0):
s+=' ("'+field+'");'+'\n'
else:
s+=' ('+field+');'+'\n'
print s
cur.execute(s)
#conn.commit()
#conn.commit()
s="""
create table CLIENTS
(
ID INTEGER NOT NULL,
COMPANY VARCHAR(50),
"LAST NAME" VARCHAR(50),
"FIRST NAME" VARCHAR(50),
"E-MAIL ADDRESS" VARCHAR(50),
"JOB TITLE" VARCHAR(50),
"BUSINESS PHONE" VARCHAR(25),
"HOME PHONE" VARCHAR(25),
"MOBILE PHONE" VARCHAR(25),
"FAX NUMBER" VARCHAR(25),
ADDRESS BLOB SUB_TYPE 1,
CITY VARCHAR(50),
"STATE/PROVINCE" VARCHAR(50),
"ZIP/POSTAL CODE" VARCHAR(15),
"COUNTRY/REGION" VARCHAR(50),
"WEB-SITE" VARCHAR(25),
NOTES BLOB SUB_TYPE 1,
INCLUDING BLOB
);
"""
s1='create ascending index IDX_CLIENTS_CITY on CLIENTS (CITY);'
"""db = 'D:/ThirdTask/Northwind.accdb'
connaccess = win32com.client.Dispatch(r'ADODB.Connection')
DSN = ('PROVIDER = Microsoft.Jet.OLEDB.4.0;DATA SOURCE = ' + db + ';')
connaccess.Open(DSN)
rs = win32com.client.Dispatch(r'ADODB.Recordset')
strsql = "select * from deer"
rs.Open(strsql, conn, 1, 3)
t = rs.GetRows()
connaccess.Close()
"""
conAcc = pyodbc.connect('DRIVER={Microsoft Access Driver (*.mdb, *.accdb)};DBQ=D:\ThirdTask\Northwind.accdb')
SqlAccess=conAcc.cursor();
SqlAccess.execute(sql.sql_count_records_clients);
CountOfRecords=SqlAccess.fetchone()[0];
print CountOfRecords
id=0
while id<CountOfRecords:
id+=1
SqlAccess.execute(sql.sql_allfields_clients, (id,))
clientdict=dict(ident=id, organization=SqlAccess.fetchone()[1]);
print clientdict
s='INSERT INTO CLIENTS (ID, COMPANY) VALUES'
s+='('+str(clientdict['ident'])+', ' +'\''+clientdict['organization']+'\''+')';
print s
cur.execute(s)
conn.commit()
#print s
#cur.execute(s)
#conn.commit()
#cur.execute(s1)
#conn.commit()
#cur=con.cursor()
con.close()
conn.close()
conAcc.close();
#print "Connect succesfully"
调试时我显示文本sql查询,其中包括(所有输出未引用)
create table CLIENTS
(
ID INTEGER NOT NULL,
COMPANY VARCHAR(50),
"LAST NAME" VARCHAR(50),
"FIRST NAME" VARCHAR(50),
"E-MAIL ADDRESS" VARCHAR(50),
"JOB TITLE" VARCHAR(50),
"BUSINESS PHONE" VARCHAR(25),
"HOME PHONE" VARCHAR(25),
"MOBILE PHONE" VARCHAR(25),
"FAX NUMBER" VARCHAR(25),
ADDRESS BLOB SUB_TYPE 1,
CITY VARCHAR(50),
"STATE/PROVINCE" VARCHAR(50),
"ZIP/POSTAL CODE" VARCHAR(15),
"COUNTRY/REGION" VARCHAR(50),
"WEB-SITE" VARCHAR(25),
NOTES BLOB SUB_TYPE 1,
INCLUDING BLOB,
CONSTRAINT PK_CLIENTS_ID PRIMARY KEY(ID)
);
create ascending index IDX_CLIENTS_CITY on CLIENTS (CITY);
create ascending index IDX_CLIENTS_COMPANY on CLIENTS (COMPANY);
create ascending index IDX_CLIENTS_FIRST_NAME on CLIENTS ("FIRST NAME");
create ascending index IDX_CLIENTS_LAST_NAME on CLIENTS ("LAST NAME");
create ascending index IDX_CLIENTS_POSTAL_CODE on CLIENTS ("ZIP/POSTAL CODE");
create ascending index IDX_CLIENTS_PRIMARYKEY on CLIENTS (ID);
create ascending index "IDX_CLIENTS_STATE/PROVINCE" on CLIENTS ("STATE/PROVINCE");
29
{'organization': u'\u041e\u0440\u0433\u0430\u043d\u0438\u0437\u0430\u0446\u0438\u044f \u0410', 'ident': 1}
INSERT INTO CLIENTS (ID, COMPANY) VALUES(1, 'Организация А')
Traceback (most recent call last):
File "D:\ThirdTask\connect.py", line 263, in <module>
cur.execute(s)
File "C:\Python27\lib\site-packages\firebirdsql\fbcore.py", line 495, in execute
stmt_type, stmt_handle = self._execute(query, params)
File "C:\Python27\lib\site-packages\firebirdsql\fbcore.py", line 457, in _execute
(h, oid, buf) = self.transaction.connection._op_response()
File "C:\Python27\lib\site-packages\firebirdsql\wireprotocol.py", line 764, in _op_response
return self._parse_op_response()
File "C:\Python27\lib\site-packages\firebirdsql\wireprotocol.py", line 308, in _parse_op_response
raise OperationalError(message, gds_codes, sql_code)
OperationalError: Dynamic SQL Error
SQL error code = -204
Table unknown
CLIENTS
At line 1, column 13
特地提出对印浆成型的要求
INSERT INTO CLIENTS (ID, COMPANY) VALUES(1, 'Организация А')
以及当它运行错误时(见上文)。怎么修?