在python中只需要regex表达式来获取表名和主键

2024-06-16 11:07:46 发布

您现在位置:Python中文网/ 问答频道 /正文

也许这个问题很愚蠢,但我无法生成regex表达式来获取表名和主键。你知道吗

表格:

CREATE TABLE 'dhcpr_dhcprelayinterface'  (
        'vrId' integer default 0,
        'ifName' string ,
        PRIMARY KEY(ifName,vrId),
        FOREIGN KEY (vrId) REFERENCES 'vr_vr'(vrId) ON DELETE CASCADE ON UPDATE CASCADE);

我正在使用: begin = re.compile(r"CREATE TABLE[ \"]*([^ \"]+)[ \"]*[(]([^/;]+)[/;]",re.IGNORECASE)获取所有表名和数据。你知道吗

但我只需要带有表名和主键的数据。你知道吗

预期输出:

dhcpr_dhcprelayinterface
PRIMARY KEY(ifName,vrId)

Tags: 数据keyreoncreatetableregexcascade
3条回答

此解决方案解决了一些您似乎不担心的问题(但值得担心),例如,SQLite允许您将转义的'写入'',并且CREATETABLE之间以及PRIMARYKEY(之间可能有任意数量的空格,甚至换行:

s = """\
CREATE TABLE 'dhcpr_dhcprelayinterface'  (
    'vrId' integer default 0,
    'ifName' string ,
    PRIMARY KEY(ifName,vrId),
    FOREIGN KEY (vrId) REFERENCES 'vr_vr'(vrId)
    ON DELETE CASCADE ON UPDATE CASCADE);
"""

pattern = """
    CREATE \s+ TABLE \s+
    '((?:[^']|'')*)'      # allows escaped single quote
    .+                    # stuff between table name and primary key
    (PRIMARY \s+ KEY\s? \([^)]*\))
"""
mo = re.search(pattern, s, re.IGNORECASE | re.VERBOSE | re.DOTALL)
print(mo.groups())

输出:

('dhcpr_dhcprelayinterface', 'PRIMARY KEY(ifName,vrId)')

使用python2.7测试以下各项:

>>> table_string = """
... CREATE TABLE 'dhcpr_dhcprelayinterface'  (
...         'vrId' integer default 0,
...         'ifName' string ,
...         PRIMARY KEY(ifName,vrId),
...         FOREIGN KEY (vrId) REFERENCES 'vr_vr'(vrId) ON DELETE CASCADE ON UPDATE CASCAD
E);"""
>>> p = r'CREATE TABLE\s+\'([^\']+)[\s\S]+PRIMARY KEY\(([^,]+),([^\)]+)\)'
>>> re.findall(p,table_string)
[('dhcpr_dhcprelayinterface', 'ifName', 'vrId')]

解释可以在here.

我相信你可以用正则表达式或者^{}来解决这个问题,但是这里有一个“有趣”的方法来解决这个问题仅仅是为了教育目的-在内存数据库中使用^{}-实际创建表并从^{} internal table中获取table_name,从^{}中获取主键列:

import sqlite3

query = """
CREATE TABLE 'dhcpr_dhcprelayinterface'  (
        'vrId' integer default 0,
        'ifName' string ,
        PRIMARY KEY(ifName,vrId),
        FOREIGN KEY (vrId) REFERENCES 'vr_vr'(vrId) ON DELETE CASCADE ON UPDATE CASCADE);
"""

db = sqlite3.connect(":memory:")
cursor = db.cursor()

cursor.execute(query)
db.commit()

# get table name
cursor.execute("select name from sqlite_master where type = 'table'")
table_name = cursor.fetchone()[0]
print(table_name)

# get primary key columns
cursor.execute("PRAGMA table_info(%s);" % table_name)
pk_columns = [row[1] for row in cursor.fetchall()[::-1]]
print(pk_columns)

印刷品:

dhcpr_dhcprelayinterface
['ifName', 'vrId']

相关问题 更多 >