我想开始在python中使用数据库。我选择postgresql作为数据库"语言"。我已经创建了几个数据库,但现在我只想检查数据库是否存在python。为此,我已经阅读了这个答案:Checking if a postgresql table exists under python (and probably Psycopg2)并尝试使用他们的解决方案:
import sys
import psycopg2
con = None
try:
con = psycopg2.connect(database="testdb", user="test", password="abcd")
cur = con.cursor()
cur.execute("SELECT exists(SELECT * from information_schema.testdb)")
ver = cur.fetchone()[0]
print ver
except psycopg2.DatabaseError, e:
print "Error %s" %e
sys.exit(1)
finally:
if con:
con.close()
但不幸的是,我只得到输出
Error relation "information_schema.testdb" does not exist
LINE 1: SELECT exists(SELECT * from information_schema.testdb)
我做错了什么,还是我错过了什么?
答案 0 :(得分:2)
你的问题让我感到困惑,因为你说你想看看数据库是否存在,但你查看了information_schema.tables视图。该视图将告诉您当前打开的数据库中是否存在表。如果要检查数据库是否存在,假设您可以访问“postgres”数据库,则可以:
import sys
import psycopg2, psycopg2.extras
cur = conn.cursor(cursor_factory=psycopg2.extras.DictCursor)
dbname = 'db_to_check_for_existance'
con = None
try:
con = psycopg2.connect(database="postgres", user="postgres")
cur = con.cursor(cursor_factory=psycopg2.extras.DictCursor)
cur.execute("select * from pg_database where datname = %(dname)s", {'dname': dbname })
answer = cur.fetchall()
if len(answer) > 0:
print "Database {} exists".format(dbname)
else:
print "Database {} does NOT exist".format(dbname)
except Exception, e:
print "Error %s" %e
sys.exit(1)
finally:
if con:
con.close()
这里发生的是您正在查找名为pg_database的数据库表。列'datname'包含每个数据库名称。您的代码将提供db_to_check_for_existance作为要检查存在的数据库的名称。例如,您可以用'postgres'替换该值,您将得到'exists'答案。如果用aardvark替换该值,您可能会得到不存在的报告。
答案 1 :(得分:1)
如果您正在尝试查看数据库是否存在:
curs.execute("SELECT exists(SELECT 1 from pg_catalog.pg_database where datname = %s)", ('mydb',))
听起来你可能会对数据库和表之间的区别感到困惑。