LibreOffice(30)PythonのSQLiteモジュールを導入

2014-03-23

旧ブログ

t f B! P L

前の関連記事:LibreOffice(29)Pythonインタプリタの置き換えは断念


LibreOffice4.2.2.1のバンドルPythonでSQLiteモジュールが使えるようにします。

Python3.3.5からSQLiteモジュールを抜き出す


まずは前回やった通りにPython3.3.5をインストールします。

C:\Python33にインストールされました。

まずはC:\Python33\python.exeでSQLiteがimportできるかやってみます。

C:\Python33>python
Python 3.3.5 (v3.3.5:62cf4e77f785, Mar  9 2014, 10:37:12) [MSC v.1600 32 bit (Intel)] on win32
Type "help", "copyright", "credits" or "license" for more information.
>>> import sqlite
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
ImportError: No module named 'sqlite'
>>> import sqlite3
>>> import libsqlite3
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
ImportError: No module named 'libsqlite3'

import sqlite3ではエラーが出てきませんね。


C:\Python33を"sqlite3"で検索すると1つのフォルダと3つのファイルが引っかかりました。

フォルダ
C:\Python33\Lib\sqlite3
ファイル
C:\Python33\libs\_sqlite3.lib
C:\Python33\DLLs\_sqlite3.pyd
C:\Python33\DLLs\sqlite3.dll

これらがSQLiteモジュールを構成しているようです。

さあ、どれをどこにコピーしましょう。

C:\Python33\Lib\sqlite3
C:\Python33\DLLs\_sqlite3.pyd

C:\Program Files (x86)\LibreOffice 4\program\python-core-3.3.3\lib
へコピー。

C:\Python33\DLLs\sqlite3.dll

C:\Program Files (x86)\LibreOffice 4\program
へコピー。

C:\Python33\libs\_sqlite3.libはコピー先がわからずコピーせず。

C:\Program Files (x86)\LibreOffice 4\programを"*.lib"で検索してもなにもでてこないので_sqlite3.libは不要なのかもしれません。

C:\Program Files (x86)\LibreOffice 4\program>python
Python 3.3.5 (v3.3.5:62cf4e77f785, Mar  9 2014, 10:37:12) [MSC v.1600 32 bit (Intel)] on win32
Type "help", "copyright", "credits" or "license" for more information.
>>> import sqlite3
>>>

エラーがでてきませんね。

必要なファイルをコピーしたらもうPython3.3.5は不要ですのでアンイストールしました。

あとはSQLiteの動作確認です。

(2014.8.3追記。LibreOfficeを上書きアップデートすると上記のコピーしたファイルは消えてしまいますので毎回コピーしないといけません。)

Python2.xのスクリプトはPython3.xでは動かない


早速ネットで探した例文を動かしてみるとほとんどエラーでとまります。

おかしい、と思ったら原因はprint文でした。

python print文のエラー - その他(プログラミング) - 教えて!goo

Python3.0からprint文の書き方が print "Hello world!" から print("Hello world!") になったそうです。

What’s New In Python 3.0 — Python 3.3.3 ドキュメント

ここにいろいろ解説がありました。

LibreOfficeに付属のPythonでSQLiteを使ってみる


データベース(sqlite) - Python | Welcome to underground

Sqlite3 / Python 3 example - Python example

これらにあるPythonスクリプトをPyCharmから動かすことができました。

12.6. sqlite3 — SQLite データベースに対する DB-API 2.0 インタフェース — Python 3.3.3 ドキュメント

ここにPythonのSQLiteモジュールの公式ドキュメントがあります。

今度はLibreOfficeのマクロからSQLiteを実行してみます。
#SQLite_check.py
import sqlite3
import sys
def SQLite_check():
    oDoc = XSCRIPTCONTEXT.getDocument()
    oText="Pythonインタプリタのバージョン\n"+sys.version+"\n\n"
    oText=oText+"Pythonインタプリタの絶対パス\n"+sys.executable+"\n\n"
    oText=oText+"Pythonモジュール検索パス\n"+"\n".join(sys.path)+"\n\n"
    oText=oText+"SQLite_test.dbから読み取ったレコード\n\n"
    db = sqlite3.connect("SQLite_test.db")
    cur = db.cursor()
    #テーブルの存在確認
    cur.execute("SELECT * FROM sqlite_master WHERE type='table' and name='test_table'")
    if cur.fetchone() != None: #すでにテーブルがあるときはテーブルをまず削除する
        cur.execute("drop table test_table")
    cur.execute("create table test_table(ichi_retsu int, ni_retsu int, san_retsu int)")
    db.commit()
    cur.execute("insert into test_table values (?, ?, ?)", (11, 11, 13,))
    test_table_data = [
        (21, 22, 23),
        (31, 32, 33),
        (41, 42, 43),
        (51, 52, 53),
    ]
    cur.executemany("insert into test_table values (?, ?, ?)", test_table_data)
    cur.execute("select * from test_table")
    i=0#読み取る列番号
    oText=oText+str(i+1)+"列目を表示します\n"
    for row in cur:
        oText=oText+str(row[i])+"\n"
    cur.close()
    db.close()
    oDoc.getText().setString(oText)
if __name__ == "__main__":
    import unopy
    XSCRIPTCONTEXT = unopy.connect()
    if not XSCRIPTCONTEXT:
        print("Failed to connect.")
        sys.exit(0)
    SQLite_check()
これをWriterで実行します。

Pythonインタプリタのバージョン
3.3.3 (default, Feb 26 2014, 23:40:42) [MSC v.1600 32 bit (Intel)]

Pythonインタプリタの絶対パス
C:\Program Files (x86)\LibreOffice 4\program\soffice.bin

Pythonモジュール検索パス
C:\Program Files (x86)\LibreOffice 4\program\python-core-3.3.3\lib
C:\Program Files (x86)\LibreOffice 4\program\python-core-3.3.3\lib\site-packages
C:\Program Files (x86)\LibreOffice 4\program
C:\Program Files (x86)\LibreOffice 4\program\python33.zip
C:\Program Files (x86)\LibreOffice 4\program\python-core-3.3.3\DLLs
C:\Program Files (x86)\LibreOffice 4\program\python-core-3.3.3
C:\Program Files (x86)\LibreOffice 4\share\extensions\dict-en\pythonpath

SQlite_test.dbから読み取ったレコード

1列目を表示します
11
21
31
41
51

Writerのドキュメントこういう結果が出力されるはずです。

SQlite_test.dbがC:\Program Files (x86)\LibreOffice 4\programに作成されています。

マクロではPythonインタプリタの絶対パスで実行されたことになるようです。

このSQLite_check.pyをオートメーションで実行するとインタプリタのあるフォルダではなくSQLite_check.pyのあるフォルダにSQlite_test.dbが作成されます。

実際に運用するときはdbの置き場所を工夫しないといけませんね。

参考にしたサイト


What’s New in Python — Python 3.3.3 ドキュメント
Python 3.3.3までの更新履歴。

What’s New In Python 3.0 — Python 3.3.3 ドキュメント
Python2.xから大幅に変更があったPython3.0の更新履歴。

データベース(sqlite) - Python | Welcome to underground
ここのスクリプトを動かすことができました。

Sqlite3 / Python 3 example - Python example
ここのスクリプトを動かすことができました。

12.6. sqlite3 — SQLite データベースに対する DB-API 2.0 インタフェース — Python 3.3.3 ドキュメント
PythonのSQLiteモジュールの公式ドキュメント。

次の関連記事:LibreOffice(31)Pythonマクロをドキュメントファイルに埋め込む

ブログ検索 by Blogger

Translate

最近のコメント

Created by Calendar Gadget

QooQ