基于多操作系统的文本数据库,带有Python和JavaScript引擎

Multi-OS text-based database with an engine for Python and JavaScript

本文关键字:Python JavaScript 引擎 带有 于多 操作系统 文本数据库      更新时间:2023-09-26

这可能是一个远取,但也许有人知道一个很好的解决方案。

我目前正在用新的wxPython 2.9做一个Python应用程序,它有新的html2库,它将继承每个操作系统的本机浏览器(Safari/IE/Firefox/Konquerer/~),这真的很棒。

目标/目的

我目前的目标是处理大块数据并使用Python超快地分析它(目前大约有110,000个条目,在字典中产生大约1,500,000到2,250,000个结果)。这个工作非常快,也是动态的,所以它只会做第一次大的读取一次(大约只需要2-4秒),然后继续监听,如果新的数据被创建在磁盘上。

到目前为止,一切顺利。现在使用新的wxPython html2库,我正在制作新的GUI。它主要是用来显示页面的,所以我现在所做的是一个模型在/html/文件夹(HTML/CSS/jQuery),它会动态地寻找一个JSON文件(jQuery抓取),这实际上是一个完整的转储的大量字典,Python脚本是在后台(守护进程)在并行线程。

JavaScript在读取一个大的JSON文件时似乎没有问题,因为一切都是(并保持)本地的,所以它并没有真正引起缓慢或任何问题。此外,CPU和内存使用率非常低。

结论

但是瓶颈来了。从JavaScript的角度来看,处理大JSON文件并不是一件轻松的事情。我必须为我需要得到的所有数据做大量的搜索和匹配,并且还在相同的大块条目中创建了大量冗余的重新循环。

我想知道是否有任何一种"引擎"是为Python和JavaScript实现的,可以处理jSON文件,或者其他基于文本的文件作为数据库。这意味着你可以真正拥有一个类似mysql的结构(当然不是指完全扩展),你至少可以定义一个表结构来保存数据,并且你可以有条不紊地进行读/写/更新。

我目前正在开发的应用程序是基于多操作系统的(至少Ubuntu, OS X和Windows XP+)。我也真的不想创建比使用wxPython(为了发行版/依赖)使用扩展数据库(就像我可以在本地主机上运行MySQL服务器)更混乱的东西,所以纯粹把它放在我的Python发行版的文件夹里。这也是为了防止编写大量代码(检查),检查用户是否已经使用服务器/数据库,这可能会与我的应用程序发生冲突,然后我将安装。


最后指出

我的目标是为未来的项目自己构建某种API,以便为需要GUI的Python脚本制定这种开发标准。既然wxPython可以更容易地接受现代浏览器技术;构建超级快速、动态和响应迅速的图形化Python应用程序似乎没有任何限制。

为什么不把数据粘贴到SQLite数据库中,然后让Python和Javascript都命中?参见在Python中将JSON转换为SQLite -如何正确地将JSON键映射到数据库列?

Sqlite包含在所有现代版本的Python中。您必须查看SQLite网站以了解其局限性

通过运行CGI HTTP服务器并让Python在那里为JavaScript的AJAX调用获取SQLite查询,我弄明白了一些事情。下面是一个小演示(仅在OS X上测试):

文件夹结构

main.py
cgi/index.py
data/
html/index.html
html/scripts/jquery.js
html/scripts/main.js
html/styles/main.css

Python server (main.py)

### CGI Server ###
import CGIHTTPServer
import BaseHTTPServer
class Handler(CGIHTTPServer.CGIHTTPRequestHandler):
    cgi_directories = ['/cgi']
    # Mute the messages in the shell
    def log_message(self, format, *args):
        return
httpd = BaseHTTPServer.HTTPServer(('', 61350), Handler)
#httpd.serve_forever()
thread = threading.Thread(name='CGIHTTPServer', target=httpd.serve_forever)
thread.setDaemon(True)
thread.start()
#### TEST SQLLite ####
# Make the database file if it doesn't exist
if not os.path.exists('data/sqlite.db'):
    db_file = open('data/sqlite.db', 'w')
    db_file.write('')
    db_file.close()
import sqlite3
conn = sqlite3.connect('data/sqlite.db')
cursor = conn.cursor()
cursor.execute('CREATE TABLE info(id INTEGER UNIQUE PRIMARY KEY, name VARCHAR(75), folder_name VARCHAR(75))')
cursor.execute('INSERT INTO info VALUES(null, "something1", "something1_name")')
cursor.execute('INSERT INTO info VALUES(null, "something2", "something1_name")')
conn.commit()

Python SQLite处理器(cgi/index.py)(演示是纯粹的SELECT,需要更多的动态)

#!/usr/bin/env python
import cgi
import json
import sqlite3
print 'Content-Type: text/json'n'n'
### Fetch GET-data ###
form = cgi.FieldStorage()
obj = {}
### SQLite fetching ###
query = form.getvalue('query', 'ERROR')
output = ''
if query == 'ERROR':
    output = 'WARNING! No query was given!'
else:
    # WARNING: The path probably needs `../data/sqlite.db` if PYTHONPATH is not defined
    conn = sqlite3.connect('data/sqlite.db')
    cursor = conn.cursor()
    cursor.execute(query)
    # TODO: Add functionality/detect if it's a SELECT, INSERT/UPDATE (then we need to conn.commit() )
    result = cursor.fetchall()
    if len(result) > 0:
        output = []
        for row in result:
            buff = []
            for entry in row:
                buff.append(entry)
            output.append(buff)
    else:
        output = 'WARNING! No results found'
obj = output
### Return the data in jSON (map) format for JavaScript
print json.dumps(obj)

JavaScript (html/脚本/main.js)

'use strict';
$(document).ready(function() {
    // JSON data read test
    var query = 'SELECT * FROM test';
    $.ajax({
        url: 'http://127.0.0.1:61350/cgi/index.py?query=' + query,
        success: function(data) {
            lg(data);
        },
        error: function() {
            lg('Something went wrong while fetching the query.');
        }
    });
});

这就结束了。浏览器中的控制台输出为;

[
    [1, "something1", "something1_name"],
    [2, "something2", "something2_name"]
]

使用这种方法,您可以让Python和JavaScript在同一个数据库中读写,而Python继续执行其系统任务(守护进程)并更新数据库条目,而JavaScript可以继续检查新数据。

此方法还可能为侦听器和两者之间的其他通信方式增加空间。

由于守护进程的原因,main.py将立即停止运行。这是因为我的wxPython脚本在它之后保持守护进程(服务器)活动,直到应用程序停止。如果将来有人想要使用这个代码;只需确保服务器代码在SQLite初始化之后运行,并取消引用httpd.serve_forever()以保持其运行。