是否可以在sqlite3中使用python脚本创建VIEW ?



熟悉python/sqlite3接口。我已经建立了一个数据库与三个表使用这个和输入数据从各种来源等。我有一个单独的".sh"/notepad脚本,我运行之后创建两个视图(一个来自两个表),然后从最初的两个视图创建一个最终的连接视图,最后生成一个最终的报告,当然还有附加信息的数据库。目前要运行它,我只需要将代码复制并粘贴到sqlite3 name.db之后。

我的问题:是否有可能通过使用python/sqlite3接口不仅创建一个简单的VIEW,而且创建一个连接的VIEW来自动化此操作?即:使用连接/游标/执行语句来创建视图(不是表)?

作为事后的考虑,可能只需要从两个初始表创建最后的连接视图就可以完成这个任务,但是我将在稍后的某个时候回到这个问题。谢谢你的宝贵时间。

编辑:这是我的代码,但它不是创建视图。在前面的脚本创建db和表之后,它从现有的TABLE1和TABLE2中提取数据,并输入数据。

db = "/path/to/db/dbfile"
def create_connection(sqliteDB):
conn=None
try:
conn=sqlite3.connect(sqliteDB)
return conn
except Error as e:
print(e)
return conn
def create_view(conn, create_view_sql):
try:
c=conn.cursor()
c.execute(create_view_sql)
except Error as e:
print (e)
def main(db):
database = db
sqlite_create_view1 = """CREATE VIEW view1 as
select id, b, c from TABLE1;"""
sqlite_create_view2 = """CREATE VIEW view2 as
select id, d, e, f from TABLE2;"""
sqlite_create_final = """CREATE VIEW final as
select a.id, a.b, a.c, b.id, b.d, b.e, b.f 
from view1 a
left join view2 b using (id); """
conn.create_connection(database)
conn.text_factory = str
if conn is Not None:
create_view (conn, sql_create_view1)
create_view (conn, sql_create_view2)
create_view (conn, final)
else:
print ("Error - cannot update view")

这是可能的。如果你在python中使用sqlite,最简单的方法是使用connection.execute。使用这个命令你可以做所有的事情。

  1. create table
  2. 插入两个虚拟行
  3. select from table
  4. 创建视图脚本
  5. select from view script
import sqlite3
conn = sqlite3.connect(":memory:")
conn.execute("CREATE TABLE t (id int, name TEXT)")
conn.execute("INSERT INTO t VALUES (1, 'row1')")
conn.execute("INSERT INTO t VALUES (2, 'row2')")
print(conn.execute("SELECT * FROM t").fetchall())
conn.execute("""
CREATE VIEW view_t as
SELECT * FROM t """)
print(conn.execute("SELECT * FROM view_t").fetchall())

当然你可以创建包含JOIN的视图。下面是使用前面代码片段中的表和SELF JOIN的示例:

conn.execute("""
CREATE VIEW view_tt as
SELECT * FROM t as t1 
JOIN t as t2 on t1.id >= t2.id
""")
print(conn.execute("SELECT * FROM view_tt").fetchall())

输出:

[(1, 'row1', 1, 'row1'), 
(2, 'row2', 1, 'row1'), 
(2, 'row2', 2, 'row2')]

最新更新