【问题标题】:Is it possible to create a VIEW in sqlite3 using python script?是否可以使用 python 脚本在 sqlite3 中创建视图?
【发布时间】:2021-12-11 07:53:24
【问题描述】:

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

我的问题:是否可以通过使用 python/sqlite3 接口创建一个简单的 VIEW 和一个连接的 VIEW 来自动执行此操作。即:使用connect/cursor/execute 语句创建VIEW(不是表)?

作为事后的想法,可能只使用从两个初始表创建的最终连接视图就可以完成此操作,但我稍后会回到这个问题。感谢您的宝贵时间。

编辑:这是我拥有的代码,但它不是创建视图。在之前的脚本创建数据库和表、输入数据之后,它从现有的 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 库创建视图,就像创建表或索引或其他任何内容一样。只需执行适当的语句。 sqlite.org/lang_createview.html
  • 你说的是什么意思...但它不是创建视图...?你检查数据库了吗?
  • 我做了,代码运行没有错误,但没有创建视图。我使用的格式与创建表格的方式相同。不确定是否遗漏了什么......

标签: python sql database sqlite


【解决方案1】:

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

这里是 sn-p 到:

  1. 创建表
  2. 插入两个虚拟行
  3. 从表格中选择
  4. 创建视图脚本
  5. 从视图脚本中选择
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 的视图。这是使用先前 sn-p 和 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')]

【讨论】:

  • 感谢您的回复,不要像这里的其他人一样粗鲁。我编辑了我的问题并添加了代码 sn-p。任何进一步的 cmets 非常感谢!创建视图是在与创建数据库本身(和表)的方式不同的脚本中完成的。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2012-07-26
  • 1970-01-01
相关资源
最近更新 更多