पायथन sqlite3 एपीआई का उपयोग करते हुए टेबल, डीबी स्कीमा, डंप आदि की सूची


150

किसी कारण से मुझे sqlite के इंटरेक्टिव शेल कमांड के समकक्ष प्राप्त करने का कोई तरीका नहीं मिल सकता है:

.tables
.dump

पायथन sqlite3 एपीआई का उपयोग कर।

क्या ऐसा कुछ है?


1
मैं सुझाव देता हूं कि प्रश्न का नामकरण कुछ गैर अजगर विशेष के लिए किया जाए क्योंकि उत्तर वास्तव में SQL का उपयोग करने वाले इंटरफेस के लिए सार्वभौमिक है।
अगस्त को

2
सच है, हालांकि मैं यह पूछने पर अजगर एपीआई की उम्मीद कर रहा था। मैं सही नाम खोजने की कोशिश करूंगा।
noamtm

3
यदि sqlite3 कमांड प्रॉम्प्ट से टेबल दिखाना चाहते हैं, तो stackoverflow.com/questions/82875/… देखें । यदि पायथन पैकेज sqlite3 का उपयोग कर रहे हैं, तो यहां दावूद तागावी-नेजाद का जवाब देखें। मेरा सुझाव है कि ओपी पायथन को वापस प्रश्न शीर्षक में जोड़े और दावूद के उत्तर का चयन करें। Google द्वारा पुराने प्रश्न के शीर्षक को जानने के बाद मुझे "शो टेबल पायथन स्केलाइट 3" द्वारा यह पृष्ठ मिला। SO के भीतर खोजें यहां उतरने में विफल होंगी। पायथन कोण के बिना, लिंक किए गए डुप्लिकेट प्रश्न 82875 से कहीं अधिक भीड़ ज्ञान प्राप्त हुआ है।
बेनेट ब्राउन

जवाबों:


106

आप SQLITE_MASTER तालिका को क्वेरी करके तालिकाओं और स्कीमाटा की सूची प्राप्त कर सकते हैं:

sqlite> .tab
job         snmptarget  t1          t2          t3        
sqlite> select name from sqlite_master where type = 'table';
job
t1
t2
snmptarget
t3

sqlite> .schema job
CREATE TABLE job (
    id INTEGER PRIMARY KEY,
    data VARCHAR
);
sqlite> select sql from sqlite_master where type = 'table' and name = 'job';
CREATE TABLE job (
    id INTEGER PRIMARY KEY,
    data VARCHAR
)

2
sqlite> .schema jobअजगर में अवैध वाक्य रचना ... मैं क्या याद कर रहा हूँ?
jbuddy_13


1
@ jbuddy_13 sqlite>sqlite कमांड लाइन क्लाइंट प्रॉम्प्ट है। उदाहरण का उद्देश्य यह प्रदर्शित करना था कि टेबल और स्कीमा को सूचीबद्ध करने के लिए डेटाबेस कैसे क्वेरी कर सकता है।
कनवर्टर

245

पायथन में:

con = sqlite3.connect('database.db')
cursor = con.cursor()
cursor.execute("SELECT name FROM sqlite_master WHERE type='table';")
print(cursor.fetchall())

मेरे अन्य उत्तर के लिए बाहर देखो । पांडा का उपयोग करने का एक बहुत तेज़ तरीका है।


13
कॉपी / पेस्ट करने के लिए आने वाले उपयोगकर्ताओं के लिए: सुनिश्चित करें cursor.close()औरdb.close()
T.Woody

1
यह सही उत्तर प्रतीत होता है, फिर भी ओपी ने एक और स्वीकृति दी ...
a_a_a

3
@a_a_a उम्म 4 साल का अंतर?
मूनक्रेटर

72

अजगर में ऐसा करने का सबसे तेज़ तरीका पंडों (संस्करण 0.16 और ऊपर) का उपयोग कर रहा है।

डंप एक टेबल:

db = sqlite3.connect('database.db')
table = pd.read_sql_query("SELECT * from table_name", db)
table.to_csv(table_name + '.csv', index_label='index')

सभी तालिकाएं डंप करें:

import sqlite3
import pandas as pd


def to_csv():
    db = sqlite3.connect('database.db')
    cursor = db.cursor()
    cursor.execute("SELECT name FROM sqlite_master WHERE type='table';")
    tables = cursor.fetchall()
    for table_name in tables:
        table_name = table_name[0]
        table = pd.read_sql_query("SELECT * from %s" % table_name, db)
        table.to_csv(table_name + '.csv', index_label='index')
    cursor.close()
    db.close()

3
कॉपी / पेस्ट करने के लिए आने वाले उपयोगकर्ताओं के लिए: सुनिश्चित करें cursor.close()और db.close()
T.Woody

2
या बेहतर उपयोगwith sqlite3.connect('database.db') as db:
Frans

23

मैं पायथन एपीआई से परिचित नहीं हूं, लेकिन आप हमेशा उपयोग कर सकते हैं

SELECT * FROM sqlite_master;

20

यहां तालिका के नाम और उन तालिकाओं के स्तंभ नाम (अजगर 2. अजगर 3 प्रकार) का प्रिंट आउट करने के लिए एक छोटा और सरल अजगर कार्यक्रम है।

import sqlite3

db_filename = 'database.sqlite'
newline_indent = '\n   '

db=sqlite3.connect(db_filename)
db.text_factory = str
cur = db.cursor()

result = cur.execute("SELECT name FROM sqlite_master WHERE type='table';").fetchall()
table_names = sorted(zip(*result)[0])
print "\ntables are:"+newline_indent+newline_indent.join(table_names)

for table_name in table_names:
    result = cur.execute("PRAGMA table_info('%s')" % table_name).fetchall()
    column_names = zip(*result)[1]
    print ("\ncolumn names for %s:" % table_name)+newline_indent+(newline_indent.join(column_names))

db.close()
print "\nexiting."

(EDIT: मुझे इस पर समय-समय पर वोट मिलते रहे हैं, इसलिए यहां उन लोगों के लिए python3 संस्करण है जो इस उत्तर को पा रहे हैं)

import sqlite3

db_filename = 'database.sqlite'
newline_indent = '\n   '

db=sqlite3.connect(db_filename)
db.text_factory = str
cur = db.cursor()

result = cur.execute("SELECT name FROM sqlite_master WHERE type='table';").fetchall()
table_names = sorted(list(zip(*result))[0])
print ("\ntables are:"+newline_indent+newline_indent.join(table_names))

for table_name in table_names:
    result = cur.execute("PRAGMA table_info('%s')" % table_name).fetchall()
    column_names = list(zip(*result))[1]
    print (("\ncolumn names for %s:" % table_name)
           +newline_indent
           +(newline_indent.join(column_names)))

db.close()
print ("\nexiting.")

17

जाहिर तौर पर Python 2.6 में शामिल sqlite3 के संस्करण में यह क्षमता है: http://docs.python.org/dev/library/sqlite3.html

# Convert file existing_db.db to SQL dump file dump.sql
import sqlite3, os

con = sqlite3.connect('existing_db.db')
with open('dump.sql', 'w') as f:
    for line in con.iterdump():
        f.write('%s\n' % line)

1
इसके साथ सावधान रहें, यदि वे INSERT INTO कथनों से आबाद हैं, तो यह आपके टेबल के सभी डेटा को प्रिंट कर देगा!
रॉबिनएल

4

बहुत सी फ़िदालिंग के बाद, मुझे टेबल के लिए मेटाडेटा सूचीबद्ध करने के लिए भी साइक्लाइट डाइक्सेस में बेहतर उत्तर मिला , यहाँ तक कि संलग्न डेटाबेस भी।

meta = cursor.execute("PRAGMA table_info('Job')")
for r in meta:
    print r

मुख्य जानकारी अनुलग्नक हैंडल नाम के साथ my_table नहीं, table_info उपसर्ग है।


मुझे आपके द्वारा लिखे गए स्निपेट में बहुत सारी त्रुटियां मिलीं, और उदाहरण के लिए या तो संदर्भित डॉक्स या अन्य उदाहरणों में "db_alias" न देखें। अन्य उदाहरणों के संदर्भ में, मुझे लगता है कि आप यह पंक्ति चाहते हैं, उदाहरण के लिए Jobतालिका: meta = cursor.execute("PRAGMA table_info('Job')") और आपकी पहली पंक्ति बाकी के लिए असंबंधित है।
nealmcb

4

अगर कोई पंडों के साथ ऐसा ही करना चाहता है

import pandas as pd
import sqlite3
conn = sqlite3.connect("db.sqlite3")
table = pd.read_sql_query("SELECT name FROM sqlite_master WHERE type='table'", conn)
print(table)

1
इस प्रश्न का उत्तर देने के लिए जुपिटर नोटबुक और पंडों की आवश्यकता नहीं है
woggioni

इस तरह के एक उपयोगी जवाब को स्लैम करने की आवश्यकता नहीं है। हालांकि, हमेशा की तरह, एक संदर्भ प्रबंधक की सिफारिश की जाती है।
user66081

मुझे यह सबसे साफ और सबसे उपयोगी उत्तर लगता है।
NL23कोड्स

2

डंप के लिए यहां देखें । ऐसा लगता है कि पुस्तकालय sqlite3 में एक डंप फ़ंक्शन है।


मैं कोशिश कर रहा हूँ: आयात sqlite3 कांग्रेस = sqlite3.connect ("test.db") con.dump () यह विफल रहता है ... मैं जाँच कर रहा हूँ
परी

2
#!/usr/bin/env python
# -*- coding: utf-8 -*-

if __name__ == "__main__":

   import sqlite3

   dbname = './db/database.db'
   try:
      print "INITILIZATION..."
      con = sqlite3.connect(dbname)
      cursor = con.cursor()
      cursor.execute("SELECT name FROM sqlite_master WHERE type='table';")
      tables = cursor.fetchall()
      for tbl in tables:
         print "\n########  "+tbl[0]+"  ########"
         cursor.execute("SELECT * FROM "+tbl[0]+";")
         rows = cursor.fetchall()
         for row in rows:
            print row
      print(cursor.fetchall())
   except KeyboardInterrupt:
      print "\nClean Exit By user"
   finally:
      print "\nFinally"

0

मैंने PHP में एक sqlite टेबल स्कीमा पार्सर लागू किया है, आप यहां देख सकते हैं: https://github.com/c9s/LazyRecord/blob/master/src/LazyRecord/TableParser/SlliteTableDefinitionParser.php

आप इस परिभाषा पार्सर का उपयोग नीचे दिए गए कोड जैसी परिभाषाओं को पार्स करने के लिए कर सकते हैं:

$parser = new SqliteTableDefinitionParser;
$parser->parseColumnDefinitions('x INTEGER PRIMARY KEY, y DOUBLE, z DATETIME default \'2011-11-10\', name VARCHAR(100)');
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.