python - 如何以编程方式确定列是否在 SQLite 中设置为 AUTOINCREMENT?

标签 python database sqlite

使用 Python 2.7 的 sqlite3 库,如何确定表的哪些列是 AUTOINCREMENT?我知道我可以使用 SQLite 命令行实用程序,但我该如何以编程方式进行操作。我粗略地查看了 SQLite 文档,我能找到的最接近的 PRAGMA 命令是 table_info .

最佳答案

AUTOINCREMENT 仅适用于主键。因此对于给定的表,您可以使用 PRAGMA table_info([tablename]) 来确定哪一列是主键:

>>> import sqlite3
>>> conn = sqlite3.connect(':memory:')
>>> conn.execute('CREATE TABLE foo (bar INTEGER PRIMARY KEY AUTOINCREMENT, baz)')
<sqlite3.Cursor object at 0x10a124f50>
>>> c = conn.cursor()
>>> c.execute('PRAGMA table_info("foo")')
<sqlite3.Cursor object at 0x10a124ef8>
>>> for row in c: print row
... 
(0, u'bar', u'INTEGER', 0, None, 1)
(1, u'baz', u'', 0, None, 0)
>>> [col[0] for col in c.description]
['cid', 'name', 'type', 'notnull', 'dflt_value', 'pk']

所以行中的最后一列是 pk 行,对于设置为 1bar

要确定主键是否自动递增完全,您可以执行以下两项操作之一:

  1. 查询sqlite_master table并检查架构中是否提到了 AUTOINCREMENT:

    >>> c.execute('SELECT 1 FROM sqlite_master WHERE tbl_name="foo" AND sql LIKE "%AUTOINCREMENT%"')
    <sqlite3.Cursor object at 0x10a124ef8>
    >>> c.fetchone()
    (1,)
    
  2. 如果有插入数据,表名会出现在sqlite_sequence table中:

    >>> c.execute('insert into foo (baz) values (1)')
    <sqlite3.Cursor object at 0x10a124ef8>
    >>> c.execute('SELECT 1 FROM sqlite_sequence WHERE name="foo"')
    <sqlite3.Cursor object at 0x10a124ef8>
    >>> c.fetchone()
    (1,)
    

关于python - 如何以编程方式确定列是否在 SQLite 中设置为 AUTOINCREMENT?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/16724409/

相关文章:

python - SQLAlchemy:当我更新models.py中的模型时,如何更新数据库中的表

c++ - 对 NOSQL DB 的建议以及稳定的 C++ 客户端

node.js - sqlize/hasOne 中的关系不起作用

android - 为什么查询无法执行?

Python:通过局域网连接?

python - 如何通过OpenCV处理VLC UDP流

python - 列出索引超出范围与 Pandas read_csv

c# - Visual Studio 2017 中的 Pythonnet

sql - 在 (DB2) SQL 中选择上个月的第一天

sqlite - 事件的android中的“NOT”子句?