�yFirebird�zDB/TABLE�쐬�pPython���W���[�� (original) (raw)

�@�Ɩ��n�̃V�X�e�����J�������ŁA�f�[�^�x�[�X�̊��p�͔����Ēʂ�Ȃ����̂Ǝv���B�ł��A����͎���i�K�ł́A�eDB�ʂ̊Ǘ��n�c�[���Ŏ����葁�����A�K�v�ƂȂ�f�[�^�x�[�X�\�����ł߂čs�����Ƃ���ʓI�ł͂Ȃ����낤���B�����āA���̃V�X�e���������A��������č����DB�t�@�C�����̂��̂�z�z����`�Ƃ��邱�Ƃ������Ƃ͎v���B
�@�������A���̏ꍇ�A�V�X�e���L�q���A�f�[�^�x�[�X�t�@�C����ƃv���O���������ɕ��U���Ă��܂��A�d�l�����Ȃ��ɂ͑S�̂��͂ݐh���Ȃ鑼�A�f�[�^�x�[�X�V�X�e�����̂̕ύX�܂��͂��̊֘A���W���[���̃��W���[�o�[�W�����A�b�v��V�X�e����Ղ̎d�l�ύX���Ƀl�b�N�������邱�ƂɂȂ��Ă��܂��̂ł͂Ȃ����Ǝv���B

�@�����ŁA����́A�ȑO��肱��Blog���Python�̃\�[�X�R�[�h���Ō��J���ė���Firebird�p�̊֐������܂Ƃ߂����W���[�����쐬���W�������A�V�X�e���z�z���ȊO�ɂ��v���W�F�N�g�⃆�[�U�ʂ̃f�[�^�x�[�X�̐V�K�쐬��Ջ@���ς�Pythpn�R�[�h��ōs�Ȃ����Ƃ��”\�ȗl�ɂ��čs�����Ǝv���B

�@����܂Ƃ߂��͎̂��̊֐��ł���B

�@�Z�p�I�ɂ͗]�����Ȃ��̂͂Ȃ����ADB�쐬���̂́A�f�[�^�x�[�X�̎�������Ŏ�@���قȂ�̂ł����܂�Firebird�̎d�l�Ɋ�Â��Ă���B
�@�f�[�^�x�[�X�T�[�o�ɓo�^����Ă���L����USER���ƃp�X���[�h���g���Adsn�Ƃ����A�l�b�g���[�N��̈ʒu�ƃt�@�C���V�X�e����̃t�@�C�����u:�v�R�����ł‚Ȃ������̂��w�肵�čs�Ȃ��d�g�݂��B

�@�����āASQL������e�[�u�������̖��̂𒊏o����ׂɂ́APythpn�̐��K�\����re���W���[���ŁASQL���̃p�^�[���ƍ��Ŏ��������B
�@���̏�ŁA�e�[�u����SEQUENCE�쐬�ł́A���̒��o�������̂ɑ���������̂��A�f�[�^�x�[�X���g�̃V�X�e���e�[�u��(�Ⴆ�΁ARDB$RELATION_ID)�ɓo�^����Ă��邩�ǂ������m�F����d�g�݂Ƃ��Ă���B����́A�ȑO����������@�ł���B

�@����́A����SQL����̖��̂̃e�[�u����SEQUENCE�����݂��Ȃ��ꍇ�ɁA�������쐬����SQL�������s����֐������s�����邱�Ƃ��”\�Ƃ���l�ɂ����̂ł���B���̂��Ƃ́ASQL�P�̎��s�łȂ��A������SQL�������X�g�Ƃ��ēn�����s����exec_sqls()�֐��̃R�[�h�Ŋm�F�����邩�Ǝv���B

�@�ڍׂ́A�ȉ��Ɍf�ڂ��Ă���\�[�X�R�[�h�Ŋm�F��������ŁA�R�s�y�ŁAUTF-8�ʼn��s������LF�݂̂̃t�@�C���ufb.py�v�Ƃ��āA���g����Pythpn�C���X�^���X���́ulib/site-packages/�v�ȉ���mire�t�H���_���쐬���A���̒��ɕ��荞��Œ��������B
�@���p�́A�ufrom mire.fb import create_db�v�̗l��import���čs�Ȃ��Ē�����͂悢�B

�@���A�����_�ł̗��p����Ƃ��āAPythpn�ł�Firebird���p�ŕK�{��kinterbasdb���W���[���́APythpn3�n�ɂ͑Ή����Ă��Ȃ��B���ׁ̈A��������Pythpn��2.6.4�ł���B�����A�J���A�v���ɂ���ẮA2.3�`2.5���̑Ή������񋟂���Ă��Ȃ����W���[���𗘗p���Ă��邩������Ȃ��B���̏ꍇ�ɂ́A�������kinterbasdb���W���[���Ƌ��ɃC���X�g�[��������΁A���삷��Ƃ͎v���B

�@�܂��A�֑��Ȃ���A����gettext���g����i18n���ۉ��ɂ��Ή����Ď������Ƃ̊�]����A���ʂȂ�P����print���ŋL�ڂ���Ƃ�����A�킴�킴�A�p��\�L�Ƃ��A���̓��{����R�����g�Ƃ��Čf�ڂ����肵�Ă���B���͂܂��@�\���Ȃ��̂ŁA�p��\�L�ɂ��s���̕��́A�uu''�v���̕�����ɂ��Ēu�����Ē����č\��Ȃ��B
�@����ɁA�\�[�X�R�[�h���ɂ͐ϋɓI�ɃR�����g��lj����Ă��邪�A������͓��{��Ƃ��Ă���B�p�ꂾ�ƁA�����̓�����~����̂ƁA������Broken English�ł̓R�[�h�{�̈ȏ�̏�񂪓`���Ȃ��Ǝv�����炾�B���ׁ̈A���Ȃ��Ƃ�Windows�‹��ւ̓����ł́A���W���[���̃w���v�Q�Ƃɕ֗��ȁuimport <���W���[����>; help(<���W���[����>)�v�̃R���\�[�����s�\���őS���{�ꂪ������������B�����help()��ASCII��������̎d�l�ƂȂ��Ă���ׂ̗l�Ȃ̂ŁA�f��Pythpn2�n�ł͎抸�������߂Ē��������B�����񂪑S��Unocode�����ꂽPythpn3�n�ł͉�������Ă���B�ǂ�Ȃɒx���Ƃ��Ԃ��Ȃ��o��ł��낤2.7�̐��������[�X��5�N�ȓ��ɂ�kinterbasdb�₻�̑��̎�v���W���[����Pythpn3�Ɉڍs���Ă��锤���B
�ŐV�ł� http://pythonlife.seesaa.net/article/146561690.html �ɂ���܂��B(2010-04-15 �NjL)

 Lib/site-packages/mire/fb.py

#!C:/Python26/python.exe

-- coding: UTF-8 --

"""
######################################################################
#exists_db() : DB�̑��݂��m�F�B �A�l: ����=1,�s����=0
#exists_seq(): �w�薼�̂�SEQUENCE�̑��݂��m�F�B�A�l: ����=1,�s����=0
#exists_tbl(): �w�薼�̂̃e�[�u���̑��݂��m�F�B�A�l: ����=1,�s����=0
#seq_name() : SQL������SEQUENCE���𒊏o���Ԃ��B
#tbl_name() : SQL������e�[�u�����𒊏o���Ԃ��B
#create_db() : DB���쐬
#create_tbl(): �w��sql�ɂ��e�[�u���쐬
#exec_sqls() : sql�̃��X�g�̘A�����s�B�����̃e�[�u����SEQUENCE�쐬�ւ�

���p��z��BDB���g�����A�v���ŁA�v���W�F�N�g�P�ʂ�DB��

�쐬����ꍇ��SQL�𕡐��ꊇ�w�肵�čς܂��邱�Ƃ��”\��

�l�ɒ����@�\�������BVIEW,TRIGGER,PROCEDURE�������Ή��B

���̊֐��ɂ́ASQL������A���̍쐬�Ώۖ��𒊏o����֐���

DB���Ɋ����̓����̂��̂��Ȃ������ׂ�֐����K�v�ƂȂ�B

��L��exists_tbl,exists_seq,tbl_name,seq_name�����̗��

���č쐬�\��(2010-02-24)�Btrigger�͒lj��ς������e�X�g�B

�������ǂ��g���̂͂��̂��炢�Ȃ̂Ō�͌���B

���A���̊֐��ɋ@�\���܂��ꂽcreate_tbls()�͔p�~�����B

"""
author = "Mire in Japan"
version = '0.0.1'
copyright = 'Copyright (c) 2010 Mire'
license = 'GPL'
url = 'http://pythonlife.seesaa.net/article/142141294.html'

import gettext #�ȉ���i18n���ۉ��̗��p�������R�[�h(������)���܂�
def exists_db(dsn='', user='SYSDBA', password='masterkey', debug=0):
"""
#### �ڑ����Ď��āADB�̑��݂��m�F ####
���݂����� 1��Ԃ��A�łȂ���΁A0��Ԃ�

    """  
from kinterbasdb import connect  
try:  
    conn=connect(dsn=dsn,user=user,password=password)  
    conn.close()  
    if not debug==0: print _('EXISTS_DB')  
    return 1  
except:  
    if not debug==0: print _('NOT EXISTS_DB')  
    return 0

def exists_trg(trg,conn=None,cur=None,dsn='', user='SYSDBA', password='masterkey'):
"""
�V�X�e���e�[�u���uRDB$TRIGGERS�v�ɐڑ����쐬�\��̃g���K�[����
�����̂��̂ƃ_�u���ĂȂ�������
"""
from kinterbasdb import connect
sql_exists="""SELECT RDB$TRIGGERS_ID
FROM RDB$TRIGGERS
WHERE RDB$TRIGGER_NAME='%s';""" % (seq)

if conn==None:  
    try:  
        conn=connect(dsn=dsn,user=user,password=password)  
        cur=conn.cursor()  
        cur.execute(sql_exists)  
        if len(cur.fetchall())==0:  # ���݂��Ȃ�������  
            return 0  
        else:  
            return 1  
    except:  
        return -1  
    finally:  
        conn.close()                # �ڑ���‚���B  
else:  
    try:  
        cur.execute(sql_exists)  
        if len(cur.fetchall())==0:  # ���݂��Ȃ�������  
            return 0  
        else:  
            return 1  
    except:  
        return -1

def exists_seq(seq,conn=None,cur=None,dsn='', user='SYSDBA', password='masterkey'):
"""
�V�X�e���e�[�u���uRDB$GENERATORS�v�ɐڑ����쐬�\���SEQUENCE����
�����̂��̂ƃ_�u���ĂȂ�������
"""
from kinterbasdb import connect
sql_exists="""SELECT RDB$GENERATORS_ID
FROM RDB$GENERATORS
WHERE RDB$GENERATORS_NAME='%s';""" % (seq)

if conn==None:  
    try:  
        conn=connect(dsn=dsn,user=user,password=password)  
        cur=conn.cursor()  
        cur.execute(sql_exists)  
        if len(cur.fetchall())==0:  # ���݂��Ȃ�������  
            return 0  
        else:  
            return 1  
    except:  
        return -1  
    finally:  
        conn.close()                # �ڑ���‚���B  
else:  
    try:  
        cur.execute(sql_exists)  
        if len(cur.fetchall())==0:  # ���݂��Ȃ�������  
            return 0  
        else:  
            return 1  
    except:  
        return -1

def exists_tbl(table,conn=None,cur=None,dsn='', user='SYSDBA', password='masterkey'):
"""
�V�X�e���e�[�u���uRDB$RELATIONS�v�ɐڑ���
�쐬�\��̃e�[�u�����������e�[�u����
�_�u���ĂȂ�������
"""
from kinterbasdb import connect
sql_exists="""SELECT RDB$RELATION_ID:e
FROM RDB$RELATIONS
WHERE RDB$RELATION_NAME='%s';""" % (table)
if conn==None:
try:
conn=connect(dsn=dsn,user=user,password=password)
cur=conn.cursor()
cur.execute(sql_exists)
if len(cur.fetchall())==0: # ���݂��Ȃ�������
return 0
else:
return 1
except:
return -1
finally:
conn.close() # �ڑ���‚���B
else:
try:
cur.execute(sql_exists)
if len(cur.fetchall())==0: # ���݂��Ȃ�������
return 0
else:
return 1
except:
return -1

def trg_name(sql, debug=0):
"""
CREATE TRIGGER ��SQL������TRIGGER���𒊏o���A���X�g�ŕԂ�
"""
import re
s='%s' % (sql)
s=sql.replace('\n', ' ')
ss=re.findall(r'(CREATE\sTRIGGER\s[a-z,A-Z,]*|create\trigger\s[a-z,A-Z,]*)',s)
nms=[]
for sq in ss:
nm=sq.split()
for n in nm:
if not re.search(r'(CREATE|create|Crate|TRIGGER|trigger|Trigger)',n):
nms.append(n)
if debug>0: print 'nms=', nms
return nms

def seq_name(sql, debug=0):
"""
CREATE SEQUENCE ��SQL������TABLE���𒊏o���A���X�g�ŕԂ�
�� ������ CREATE GENERATOR �͔񐄏��ɕt�A�Ή������B
"""
import re
s='%s' % (sql)
s=sql.replace('\n', ' ')
ss=re.findall(r'(CREATE\sSEQUENCE\s[a-z,A-Z,]*|create\sequence\s[a-z,A-Z,]*)',s)
nms=[]
for sq in ss:
nm=sq.split()
for n in nm:
if not re.search(r'(CREATE|create|Crate|SEQUENCE|sequence|Sequence)',n):
if n[-1]==';':
nms.append(n[:-1])
else:
nms.append(n)
if debug>0: print 'nms=', nms
return nms

def tbl_name(sql, debug=0):
"""
CREATE TABLE ��SQL������TABLE���𒊏o���A���X�g�ŕԂ�
"""
import re
s='%s' % (sql)
s=sql.replace('\n', ' ')
ss=re.findall(r'(CREATE\sTABLE\s[a-z,A-Z,]*(|create\stable\s[a-z,A-Z,]*()',s)
nms=[]
for sq in ss:
nm=sq.split()
for n in nm:
if not re.search(r'(CREATE|create|Crate|TABLE|table|Table)',n):
if n[-1]=='(':
nms.append(n[:-1])
else:
nms.append(n)
if debug>0: print 'nms=', nms
return nms

def create_db(dsn='localhost:DUMMY',user='SYSDBA',password='masterkey',page_size=None):
"""

    """  
from kinterbasdb import create_database  
ds=dsn[len(dsn.split(':')[0]):]  
sql="CREATE DATABASE '%s' USER '%s' PASSWORD '%s'" % (ds,user,password)  
if not page_size is None:  
    sql=sql+'PAZE_SIZE %d' % (page_size)  
conn=create_database(sql)  
conn.commit()  
conn.close()

def create_tbl(sql='',dsn='localhost:DUMMY',user='SYSDBA',password='masterkey'):
from kinterbasdb import connect
conn=connect(dsn=dsn,user=user,password=password)
cur=conn.cursor()
cur.execute(sql)
conn.commit()
conn.close()

def exec_sqls(sqls=[],dsn='localhost:DUMMY',user='SYSDBA',password='masterkey', debug=0):
import re
from kinterbasdb import connect
#�ȉ���i18n���ۉ��̗��p�������R�[�h(������)���܂�
gettext.bindtextdomain('mire', './language/i18n')
gettext.textdomain('mire')
_ = gettext.gettext
conn=connect(dsn=dsn,user=user,password=password, debug=0)
cur=conn.cursor()
for sql in sqls:
if re.search(r'(CREATE\sTABLE\s|create\stable\s)',sql):
#�e�[�u���쐬SQL�Ȃ��
tables = tbl_name(sql) #TABLE�����擾
if len(tables)==1: #TABLE��������o������
table=tables[0]
ex_tbl=exists_tbl(table=table, dsn=dsn,
conn=conn,cur=cur, user=user, password=password)
if debug>0: print _('ex_tbl='), ex_tbl
if ex_tbl==0:
#�e�[�u�������݂��Ȃ��̂�
try:
cur.execute(sql) #����SQL�����s������
except:
if debug>0:
print _('failed in SQL execution.') #SQL���s�Ɏ��s���܂����B
print u''
else:
if debug>0:
print _('Already, table '%s' exists in this DB.' % (table))
#���ɁA�e�[�u��'%s' �͂���DB���ɑ��݂��܂��B
print _('Then, The SQL for CREATE TABLE was not executed.')
#����ŁA�e�[�u���쐬��SQL�͎��s����܂���ł����B
else:
if debug>0:
print _('table name was not specified.')
print 'tables=', tables
print 'sql='
print sql
elif re.search(r'(CREATE\sSEQUENCE\s|create\ssequence\s)',sql):
#SEQUENCE�쐬�Ȃ�
sequences = seq_name(sql)
if len(sequences)==1:
sequence = sequences[0]
ex_seq = exists_seq(seq=sequence, dsn=dsn,
conn=conn,cur=cur, user=user, password=password)
if debug>0: print _('ex_seq='), ex_seq
if ex_seq==0:
#�A�Ԃ����݂��Ȃ��̂�
try:
cur.execute(sql) #����SQL�����s������
except:
if debug>0:
print _('failed in SQL execution.') #SQL���s�Ɏ��s���܂����B
print u''
else:
if debug>0:
print _('Already, sequence '%s' exists in this DB.' % (sequence))
#���ɁASEQUENCE '%s' �͂���DB���ɑ��݂��܂��B
print _('Then, The SQL for CREATE SEQUENCE was not executed.')
#����ŁASEQUENCE�쐬��SQL�͎��s����܂���ł����B
else:
if debug>0:
print _('sequence name was not specified.')
# sequence��������o���܂���ł����B
print 'sequences=', sequences
print 'sql='
print sql
else:
try:
cur.execute(sql)
except:
if debug>0:
print _('SQL can not be executed.')
#SQL�͎��s�o���܂���B
print sql
conn.commit()
conn.close()

#def create_tbls(sqls=[],dsn='localhost:DUMMY',user='SYSDBA',password='masterkey'):

from kinterbasdb import connect

from mire.fb import exists_tbl

conn=connect(dsn=dsn,user=user,password=password)

cur=conn.cursor()

for sql in sqls:

tables=tbl_name(sql)

if not len(tables)==1:

print 'tables=', tables

else:

table=tables[0]

if exists_tbl(table=table,conn=conn,cur=cur,dsn=dsn, user=user, password=password)==0:

print 'CREATE TABLE'

cur.execute(sql)

conn.commit()

conn.close()

| | | | ------------------------------------------------------------------------------------- |

�yFIREBIRD �֘A���e�z