Python 带有sqlalchemy和postgres的可搜索列

Python 带有sqlalchemy和postgres的可搜索列,python,postgresql,sqlalchemy,Python,Postgresql,Sqlalchemy,我是数据库的初学者,我不确定是否能正确理解它们 据我所知,给定一个包含多个列的表,我可以进行如下查询: 从col1>3的表中选择* 此查询的复杂性为N。为了使搜索更有效,我可以使用col1作为索引。在这种情况下,同一查询的复杂性应为logN 现在据我所知,在sqlalchemy中将列设置为主键,使其成为可搜索的列 如果这是正确的,我不理解为什么我不能将重复的列设置为主键 例如: import sqlite3

我是数据库的初学者,我不确定是否能正确理解它们

据我所知,给定一个包含多个列的表,我可以进行如下查询: 从col1>3的表中选择*

此查询的复杂性为N。为了使搜索更有效,我可以使用col1作为索引。在这种情况下,同一查询的复杂性应为logN

现在据我所知,在sqlalchemy中将列设置为主键,使其成为可搜索的列

如果这是正确的,我不理解为什么我不能将重复的列设置为主键

例如:

import sqlite3                                                                                                                                                                                              
from sqlalchemy import *                                                                                                                                                                                    


metadata = MetaData()                                                                                                                                                                                       
table = Table('example', metadata,                                                                                                                                                                          
              Column('col1', Integer, primary_key=True),                                                                                                                                                    
              Column('col2', Integer))                                                                                                                                                                      

engine = create_engine('sqlite:///:memory:', echo=True)                                                                                                                                                     
con = engine.connect()                                                                                                                                                                                      

table.create(engine, checkfirst=True)                                                                                                                                                                       


data = [{'col1':1, 'col2':2}, {'col1':3, 'col2':4},  {'col1':3, 'col2':4}]                                                                                                                                  
ins = table.insert().values(data)                                                                                                                                                                           
con.execute(ins)                                                                                                                                                                                            


print list(con.execute("SELECT * FROM example"))                                                                                                                                                            



          returns

IntegrityError: (sqlite3.IntegrityError) PRIMARY KEY must be unique [SQL: u'INSERT INTO example (col1, col2) VALUES (?, ?), (?, ?), (?, ?)'] [parameters: (1, 2, 3, 4, 3, 4)]
如何在logN中搜索非唯一列

编辑:这个例子是使用sqlite编写的,但我实际上是在使用postgres .

现在据我所知,在sqlalchemy中将列设置为主键,使其成为可搜索的列

主键列会自动编制索引,但通常需要为非唯一列编制索引。您可以通过以下方式执行此操作:

您可以在日志文件中看到相应的SQL:

INFO sqlalchemy.engine.base.Engine CREATE INDEX ix_example_col1 ON example (col1)

据我所知,现在应该可以在SQL中将列设置为主键进行搜索了。SQLAlchemy只是一个使用SQL数据库的工具。
INFO sqlalchemy.engine.base.Engine CREATE INDEX ix_example_col1 ON example (col1)